Python Embedded: Beschaffung, Integration und Anwendung
Einführung
Python ist eine der bekanntesten und am meisten genutzten Programmiersprachen - dies bestätigen sowohl die Erstplatzierung im PYPL Index als auch Rang Drei des TIOBE Index (Stand: April 2020). Die Freiheit diese “[…] Software auszuführen, zu studieren, zu ändern und zu verbreiten […]” resultiert in aktuell über 118.000 Site Packages und Machine Learning Engineers als auch Data Scientists nutzen Python intensiv.
Nichtsdestotrotz gibt es Systemumgebungen in denen es untersagt ist Python direkt zu installieren aufgrund von IT Sicherheits-Richtlinien. Glücklicherweise bietet die Python Software Foundation eine sogenannte Embedded Distribution ab Version 3.5 an. Diese besteht aus einer minimalen Laufzeitumgebung und ist dafür gedacht in andere Applikationen oder Umgebungen eingebettet zu werden.
Dieser Artikel beschreibt eine Vorgehensweise zur Beschaffung der Python Embedded Distribution, welche Anforderungen eine Systemumgebung erfüllen muss für dessen Ausführung und wie Site Packages hinzugefügt werden.
Die fortan beschriebenen Ausführungen beziehen sich auf Computer mit Windows 7 oder höher als Betriebssystem. Die gezeigten bespielhaften Anwendungen nutzen Windows 10.
Vorabklärungen und Anforderungen
Die Python Embedded Distribution ist dafür vorgesehen in eine andere Applikation integriert zu werden und demnach richten sich die Anforderungen für dessen Verwendung hauptsächlich nach den Möglichkeiten der Einbettung, sodass Python mit der Applikation kommunizieren kann. Ein anderer Aspekt betrifft das verwendete Betriebssystem selbst, welches eine bestimmte Runtime enthalten haben muss, damit Python grundsätzlich lauffähig ist.
Microsoft C Runtime
Die Dokumentation des Python Embeddable Package führt eine wichtige Notiz auf:
“The embedded distribution does not include the Microsoft C Runtime and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user’s system previously or automatically via Windows Update, and can be detected by finding ucrtbase.dll in the system directory.”
Die Embedded Distribution von Python greift auf die Microsoft C Runtime zurück und daher muss sichergestellt sein, dass diese auch installiert ist auf dem genutzten Betriebssystem. Feststellbar ist das Vorhandensein der Runtime mittels Suchen der Bibliothek namens ucrtbase.dll
im Verzeichnis <SysDrive>\Windows\System32\
. Diese Anforderung ist mandatorisch für die Funktionsfähigkeit von Python.
Integrierungs-Applikation
Die Einbettung hängt sowohl von den Anforderungen der zu integrierenden Applikation an Python als auch von den verwendeten Site Packages zur Erstellung der Software-Lösung in Python ab. An einem Beispiel lässt sich dies anschaulich erklären.
Note: Die Evaluierung und Erstellung der Lösung ist ein Back-and-Forth-Prozess. Sofern ein Weg zu einer Sackgasse führt, müssen Schritte zurück und/oder erneut gegangen werden um zum Ziel zu gelangen.
Angenommen die Software-Lösung in Python sei die Änderung der Farbtiefe von Bildern (von z.B. 32bit auf 8bit). Die Lösung wird analysiert und anschließend ein Design erstellt mit dem Ergebnis das Site Package Pillow zu verwenden. Laut dem Python Package Index ist die neueste Version 7.1.2 und Pillow’s Dokumentation besagt, dass mindestens die Version 3.5 von Python benötigt wird. Auf der anderen Seite steht die Integrierungs-Applikation, welche Python nur in den Versionen 3.4 bis 3.6 sowohl in der 32bit- als auch 64bit-Variante unterstützt. Folgende Darstellung zeigt die Abhängigkeiten der zu verwendenden Komponenten.

Die drei Ebenen Integrierungs-Applikation, Python und Site Packages enthalten für sich alle möglichen Komponenten. Verbindungslinien von einer Ebene zur anderen zeigen die zueinander kompatiblen Komponenten auf. Die grün hervorgehobenen Verbindungslininen geben schlussendlich die tatsächlich verwendbaren Komponenten an. In diesem Falle kann die 32bit- als auch 64bit-Variante von Python in der Version 3.5 oder 3.6 verwendet werden um den Anforderungen gerecht zu werden.
Durchführung
Folgend wird die Beschaffung der Python Embedded Distribution als auch die Integration von Site Packages beschrieben.
Python Embedded beziehen
Die Python Embedded Distribution ist über die Website der Python Releases for Windows zu beziehen. Unter den Stable Releases ist die entsprechende Version zu suchen (z.B. Python 3.6.8 - Dec. 24, 2018) und anschließend das sogenannte embeddable zip file in der 32bit- (x86) oder 64bit-Variante (x86-64) herunterzuladen. Die Zip-Datei kann auf dem Ziel-System in jeden beliebigen Ordner entpackt werden.

Die Ausgabe der Version von Python zeigt folgendes an:
C:\Users\Daniel\Desktop\python36\python-3.6.8-embed-amd64>python.exe --version
Python 3.6.8
Ein Start der python.exe
gibt die gewohnte Programmierumgebung über die Kommmandozeile:
C:\Users\Daniel\Desktop\python36\python-3.6.8-embed-amd64>python.exe
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
>>> import sys
>>> sys.exit ()
Site Packages installieren
Die Integration der Site Packages in die Python Embedded Distribution gestaltet sich umfangreicher aufgrund der Tatsache, dass eine Referenz-Umgebung erstellt werden muss und beinhaltet
- die Installation von Python
- die Installation des Package Installer for Python (pip)
- die Installation der notwendigen Site Packages, bedingt durch die angestrebte Software-Lösung.
Anschließend werden die zuvor installierten Site Packages in das Verzeichnis der entpackten Python Embedded Distribution kopiert und der Umgebung bekannt gemacht.
Die Referenz-Umgebung kann auf jedem beliebigen System erstellt werden - d.h. es muss nicht auf dem Ziel-System für Python Embedded geschehen.
Folgend wird das Ausfindigmachen und Integrieren der Site Packages beschrieben. Eine Installation der notwendigen Komponenten wird vorausgesetzt.
Mittels Befehl pip show -f [package-name]
wird Information zu sowohl den Anforderungen des Site Package selbst als auch dessen notwendige Dateien anzeigt. Nachfolgend ist beispielhaft die Ausgabe des Site Package Pillow angegeben.
(pyemb) C:\_pyenv\pyemb>pip show -f Pillow
Name: Pillow
Version: 7.1.2
Summary: Python Imaging Library (Fork)
Home-page: https://python-pillow.org
Author: Alex Clark (PIL Fork Author)
Author-email: aclark@python-pillow.org
License: HPND
Location: c:\_pyenv\pyemb\lib\site-packages
Requires:
Required-by:
Files:
PIL\BdfFontFile.py
PIL\BlpImagePlugin.py
PIL\BmpImagePlugin.py
...
Pillow-7.1.2.dist-info\WHEEL
Pillow-7.1.2.dist-info\top_level.txt
Pillow-7.1.2.dist-info\zip-safe
Aus dieser Information ist zu entnehmen, dass
- das Site Package im Verzeichnis
c:\_pyenv\pyemb\lib\site-packages
installiert ist - keine Abhängigkeiten zu weiteren Site Packages bestehen (
Requires: [...]
) - die notwendigen Dateien in den Verzeichnissen
PIL
undPillow-7.1.2.dist-info
liegen.
Um dieses Site Package in der Python Embedded Distribution nutzbar zu machen, müssen die besagten Verzeichnisse aus c:\_pyenv\pyemb\lib\site-packages
in eine eigens erstellte Verzeichnis-Struktur kopiert werden. Wichtig: Dieser Vorgang muss ebenso für alle zusätzlich geforderten Site Packages durchgeführt werden (in diesem Falle existieren keine weiteren Abhängigkeiten). Folgend wird eine mögliche Verzeichnis-Struktur aufgezeigt:
+-- Python Embedded (Oberverzeichnis)
+-- python-3.6.8-embed-amd64 (Python Embedded Distribution)
+-- scripts (Verzeichnis für Skripte)
+-- lib
+-- site-packages (Verzeichnis für Site Packages)
+-- PIL
+-- Pillow-7.1.2.dist-info
Schlussendlich werden der Python Embedded Distribution die Pfade zu den Site Packages und Skripten bekannt gemacht, indem diese der Datei python36._pth
aus Verzeichnis python-3.6.8-embed-amd64
hinzugefügt werden:
[file: python36._pth]
python36.zip
.
# Uncomment to run site.main() automatically
#import site
../lib/site-packages
../scripts
Die resultierende Python Embedded Distribution ist nun fähig auf die Funktionalitäten des Site Package zuzugreifen und bereit in die Integrierungs-Applikation eingebettet zu werden.
Anwendungsbeispiele
Quellen der Anwendungen:
- Anwendung 1: Bildbearbeitung, Pillow
- Anwendung 2: RPA, UiPath Studio, Machine Learning, scikit-learn
Anwendung 1: Bildbearbeitung, Pillow
Das folgend beschriebene Beispiel zeigt die Verwendung des Site Package Pillow und bezieht sich auf die in der Durchführung beschriebenen Erläuterungen. Sämtliche Schritte zur Bereitstellung der Python Embedded Distribution inklusive des Site Package sind dieser zu entnehmen.
Ein Python-Skript soll erstellt werden, welches mehrfahrbige in Schwarz-Weiß-Bilder umwandelt. Mittels Pillow ist dies folgendermaßen zu bewerkstelligen:
[file: pillow_example.py]
import sys
import os
from PIL import Image
def main ():
if len (sys.argv) != 2:
print ("Please provide image file as argument.\nProgram will exit now...")
return
imgFilePath = sys.argv[1]
with Image.open (imgFilePath) as img:
img = img.convert ("L")
fileName, fileExt = os.path.splitext (imgFilePath)
img.save (fileName + "_bw" + fileExt)
return
if __name__ == "__main__":
main ()
Um dieses Skript in der Umgebung von Python Embedded laufen zu lassen ist nachstehender Befehl in einer Kommandozeile auszuführen (es wird beispielhaft das existierende Bild ‘P1030459.JPG’ verwendet):
C:\Users\Daniel\Desktop\python36>python-3.6.8-embed-amd64\python.exe pillow_example.py P1030459.JPG

Das Resultat ist ein neues Bild namens ‘P1030459_bw.JPG’ in schwarz-weiß.
Anwendung 2: RPA, UiPath Studio, Machine Learning, scikit-learn
Eine fortgeschrittene Anwendung bildet die Kombination von RPA und Python. Die Software-Lösung soll den Inhalt von E-Mails aus einem Postfach lesen und Spam klassifizieren mittels einem in Python erstellten Machine Learning Algorithmus.
Die Integrations-Applikation soll UiPath Studio v2019.10 sein, eine Entwicklungsumgebung zur Erstellung von UI-Automationen, welche das Lesen und Bereitstellen des Inhalts der E-Mails übernimmt. UiPath stellt ein Activity Package zur Kommunikation mit Python zur Verfügung, dessen aktuelle Version 1.0.7346.28183 ist. Die Activity Python Scope
gibt Aufschluss über die verwendbaren Versionen von Python. Die Eigenschaft Version der Activity stellt folgende Auswahl bereit: [‘Auto’, ‘Python_27’, ‘Python_33’, ‘Python_34’, ‘Python_35’, ‘Python_36’]. Außerdem kann sowohl die 32bit- als auch 64bit-Variante von Python verwendet werden.
Die Anforderungen an Python werden weder in der Package Gallery noch in dem Python Activity Guide angegeben, sodass keine andere Wahl bleibt als das Package herunterzuladen, zu einem UiPath-Projekt hinzuzufügen und die Activities selbst zu evaluieren.
Auf der Ebene der Python Site Packages wird scikit-learn für die Implementierung der Machine Learning Komponente verwendet. Laut dem Python Package Index ist die neueste Version 0.22.2 und benötigt mindestens die Version 3.5 in der 64bit-Variante von Python sowie die Site Packages Numpy >= 1.11.0, SciPy >= 0.17.0 und joblib >= 0.11.
Das Vorgehen zur beschriebenen Durchführung unterscheidet sich lediglich derart, dass
- mehr Python Site Packages inkludiert werden müssen aufgrund von Abhängigkeiten
- die Kommunikation zwischen Integrierungs-Applikation und Python mittels einem API geschieht.
Python Site Packages
Die Package Information zu scikit-learn gibt folgendes aus:
(pyemb) C:\_pyenv\pyemb>pip show -f scikit-learn
Name: scikit-learn
Version: 0.22.2
Summary: A set of python modules for machine learning and data mining
Home-page: http://scikit-learn.org
Author: None
Author-email: None
License: new BSD
Location: c:\_pyenv\pyemb\lib\site-packages
Requires: numpy, joblib, scipy
Required-by:
Files:
scikit_learn-0.22.2.dist-info\COPYING
scikit_learn-0.22.2.dist-info\INSTALLER
scikit_learn-0.22.2.dist-info\METADATA
...
sklearn\utils\tests\test_validation.py
sklearn\utils\validation.py
sklearn\utils\weight_vector.py
Aus dieser Information ist zu entnehmen, dass
- das Site Package im Verzeichnis
c:\_pyenv\pyemb\lib\site-packages
installiert ist - Abhängigkeiten zu weiteren Site Packages bestehen (
numpy, joblib, scipy
) - die notwendigen Dateien in den Verzeichnissen
scikit_learn-0.22.2.dist-info
undsklearn
liegen.
Neben den Dateien für scikit-learn müssen auch die Information jedes einzelnen abhängigen Site Package numpy, joblib sowie scipy evaluiert und deren Dateien kopiert werden. Dies wiederholt sich solange, bis keine weiteren Abhängigkeiten vorhanden sind. Beispielhaft wird die Information von numpy ausgegeben:
(pyemb) C:\_pyenv\pyemb>pip show -f numpy
Name: numpy
Version: 1.18.4
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: c:\_pyenv\pyemb\lib\site-packages
Requires:
Required-by: scipy, scikit-learn
Files:
..\..\Scripts\f2py.exe
numpy-1.18.4.dist-info\INSTALLER
numpy-1.18.4.dist-info\LICENSE.txt
numpy-1.18.4.dist-info\LICENSES_bundled.txt
...
numpy\tests\test_scripts.py
numpy\tests\test_warnings.py
numpy\version.py
Das Site Package hat keinerlei weitere Abhängigkeiten und die notwendigen Dateien bestehen aus den Verzeichnissen numpy-1.18.4.dist-info
und numpy
sowie der ausführbaren Datei f2py.exe
unter Scripts.
Eine mögliche resultierende Verzeichnis-Struktur der Python Embedded Distribution nach Kopieren sämtlicher Site Packages ist folgend angegeben:
+-- Python Embedded (Oberverzeichnis)
+-- python-3.6.8-embed-amd64 (Python Embedded Distribution)
+-- scripts (Verzeichnis für Skripte)
|-- f2py.exe
+-- lib
+-- site-packages (Verzeichnis für Site Packages)
+-- numpy
+-- numpy-1.18.4.dist-info
+-- joblib
+-- joblib-0.14.1.dist-info
+-- scipy
+-- scipy-1.4.1.dist-info
+-- sklearn
+-- scikit_learn-0.22.2.dist-info
Das Bekanntmachen der Pfade für Python geschieht wie in der Durchführung beschrieben.
Python API der Integrierungs-Applikation
Hauptaugenmerk für diese Komponente der Software-Lösung liegt auf der Art und Weise der Verwendung der Python Activities. Aufgrund der Tatsache, dass UiPath Studio eine visuelle Programmierumgebung bietet, lässt sich die Implementierung bildlich darstellen. Die Kommentare geben Aufschluss über die gesetzten Activity Properties.

Die Activity Invoke Python Method
ruft eine Python-Funktion namens load_predict
auf. Die Definition dieser Funktion sieht folgendermaßen aus (Info: es handelt sich um einen Auszug aus dem Python-Skript mit Helferfunktionen):
[file: spamest_consumer.py (Auszug)]
import sys
from sklearn.neural_network import MLPClassifier
try:
import cPickle as pickle
except ModuleNotFoundError:
import pickle
def load_vectorizer (vecFilePath):
with open (vecFilePath, 'rb') as fileObj:
vec = pickle.load (fileObj)
return vec
def load_estimator (mlmFilePath):
with open (mlmFilePath, 'rb') as fileObj:
est = pickle.load (fileObj)
return est
def predict (est, X):
y_pred = est.predict (X)
return y_pred
def load_predict (mlmFilePath, vecFilePath, sample):
vec = load_vectorizer (vecFilePath)
X = vec.transform ([sample]).toarray ().astype ('f4')
return predict (load_estimator (mlmFilePath), X)
Der Funktion load_predict
werden drei Parameter übergeben (zwei Dateipfade zu serialisierten Python-Objekten sowie das auszuwertende Sample). Wichtig zu erkennen ist, dass die Parameter sich exakt in dem Listen-Objekt inputParamList
in UiPath Studio widerspiegeln.
Zusammenfassung und Ausblick
In wenigen Schritten lässt sich ein Windows-System mit einer vollwertigen Python-Laufzeitumgebung ausstatten - (bis auf das Referenz-System) gänzlich ohne Installationen. Die Laufzeitumgebung lässt sich grundsätzlich überall ablegen und ausführen, sei es lokal oder in einem Netzwerk-Verzeichnis.
Die Anwendungsbeispiele zeigen nur einen Ausschnitt der Kommunikationswege auf. Eine weitere Einbettung ist möglich mittels Aufrufen der Python Executable mit Parametern und anschließendem Auslesen des Standard Outputs (stdout). Hierdurch werden sogar bestehende Abhängigkeiten zwischen Site Packages und Integrierungs-Applikation aufgelöst, sodass jede Version der Python Embedded Distribution verwendbar ist.