Wozu der Aufwand?

Es kommt der Tag, an dem man seine Python Scripte ausserhalb seiner Entwicklungsumgebung einsetzen möchte. Von anderen Programmiersprachen kennt man die Möglichkeit, die Programme zu compilieren und diese unter Windows als ausführbare .exe oder .dll Dateien zu verteilen.

Compilieren im eigentlichen Sinn lässt sich ein Python Script nicht. Man kann jedoch Python Scripte auch in .exe verwandeln und diese verteilen. Der Grund dafür kann sein, daß man nicht überall eine installierte Python-Umgebung voraussetzen möchte oder auch um seinen Quellcode gegen neugierige Blicke oder Änderungen zu schützen. In diesen .exe-Dateien wird dann neben dem Script noch eine Python-Laufzeitumgebung und benötigte Bibliotheken mit eingepackt, so daß alle benötigten Bestandteile dabei sind und das Programm sofort auf dem Zielrechner ausführbar ist.

Welche Möglichkeiten gibt es?

Es gibt mehrere Möglichkeiten, aus Python Scripten solche ausführbaren Programme zu erstellen:

  • PyInstaller (Für Linux und Windows, alle Python-Versionen seit 1.5, wird noch aktiv entwickelt, kann eine einzelne Datei erstellen)
  • py2exe (wird oft und gerne benutzt, hat mir persönlich aber ein paar Einschränkungen, die man beim Programmieren beachten muss, hat Schwierigkeiten mit manchen Bibliotheken)
  • McMillan’s Installer (aus dem PyInstaller entstand)

Sowie diverse andere, abhängig von Betriebssystem und Verwendeter Python-Version (z.B. Microsoft Visual Studio für IronPython, die .NET Version von Python).

Beispielhafte Anwendung mit PyInstaller

1. PyInstaller herunterladen und entpacken

PyInstaller gibt es als .zip Archiv für Windows auf der Projekthomepage zum Download. Aktuell beim Verfassen dieses Artikels ist die Version 1.2. Die herunter geladene Archivdatei pyinstaller_1.2.zip entpackt man in einem Pfad seiner Wahl. Ich gehe im Folgenden davon aus, daß dies C:\Python24\PyInstaller_1.2\ ist.

2. PyInstaller konfigurieren

PyInstaller muss vor der ersten Verwendung auf dem System konfiguriert werden. Damit stellt PyInstaller fest welche Version von Python verwendet werden soll, welche Optionen verfügbar sind, ob Zlib, Unicode oder UPX verfügbar sind und ein paar Dinge mehr. Das ist allerdings recht einfach, da PyInstaller selbst diese Konfiguration vornimmt.

C:\> cd C:\Python24\PyInstaller_1.2\
C:\Python24\PyInstaller_1.2> Configure.py
I: computing EXE_dependencies
I: Finding TCL/TK...
I: found TCL/TK version 8.4
I: testing for Zlib...
I: ... Zlib available
I: Testing for ability to set icons, version resources...
I: ... resource update available
I: Testing for Unicode support...
I: ... Unicode available
I: testing for UPX...
I: ...UPX unavailable
I: computing PYZ dependencies...

C:\Python24\pyinstaller_1.2>

Damit ist die Konfiguration abgeschlossen. PyInstaller ist jetzt bereit, auf diesem System ausführbare Dateien zu erstellen.

3. Spec-File erstellen

Eine .spec-Datei beschreibt das später zu erstellende Programm. Das Testprogramm ist eine einfache helloworld.py im Ordner C:\Test:

#!/usr/bin/env python
print "hello world!"

Für dieses einfache Programm wird nun die .spec-Datei erstellt:

C:\Test> C:\Python24\PyInstaller_1.2\Makespec.py helloworld.py
wrote C:\test\helloworld.spec
now run Build.py to build the executable

Danach steht im gleichen Ordner zusätzlich unsere .spec-Datei, die Anweisungen für den eigentlichen PyInstaller enthält:

a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'helloworld.py'],
             pathex=['C:\\test'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name='buildhelloworld/helloworld.exe',
          debug=False,
          strip=False,
          upx=False,
          console=True )
coll = COLLECT( exe,
               a.binaries,
               strip=False,
               upx=False,
               name='disthelloworld')

Diese Datei kann nun auch bearbeitet werden um zum Beispiel weitere Ressourcen hinzuzufügen, zum Beispiel config-Dateien, Icons, Bilder und sonstige Dateien die für den späteren Betrieb notwendig sind.

Makespec.py kennt diverse Optionen um den Prozess zu beeinflussen, wovon man jedoch in den meisten Fällen nur einige benötigt:

-F, --onefile
	Erstellt eine einzelne Datei, die alles beinhaltet.

-D, --onedir
	Erstellt ein Verzeichnis mit allen benötigten Dateien (default).

-w, --windowed, --noconsole     
	Das zu erstellende Programm wird als Windows Programm gestartet 
	ohne eine Konsole dafür zu öffnen.

-o DIR, --out=DIR
	Erstellt die .spec-Datei im angegebenen Verzeichnis. Wenn nicht 
	angegeben und das aktuelle Verzeichnis ist das PyInstaller-
	Verzeichnis, wird ein Unterverzeichnis angelegt und dort die 
	.spec Datei hineingeschrieben. Steht man in einem anderen 
	Verzeichnis, so wird die .spec-Datei in das aktuelle Verzeichnis 
	geschrieben.

--icon=<file.ico>     
	Fügt dem zu erstellenden Programm das Icon FILE.ICO hinzu.

--icon=<file.exe,n>
	Fügt dem zu erstellenden Programm das N-te Icon aus FILE.EXE 
	hinzu.

-n NAME, --name=NAME
	Gibt dem Programm einen Namen. Wenn dieser Name nicht angegeben 
	wird bekommt das zu erstellende Programm den Namen des ersten 
	angegebenen Scripts.

4. Ausführbare .exe erstellen

Zu diesem letzten Schritt zieht man nun die Build.py aus dem PyInstaller-Ordner heran und füttert sie mit der oben erstellten .spec-Datei:

C:\test> c:\Python24\pyinstaller_1.2\Build.py helloworld.spec
checking Analysis
building Analysis because out0.toc non existent
running Analysis out0.toc
Analyzing: c:\Python24\pyinstaller_1.2\support\_mountzlib.py
Analyzing: c:\Python24\pyinstaller_1.2\support\useUnicode.py
Analyzing: helloworld.py
Warnings written to C:\test\warnhelloworld.txt
checking PYZ
rebuilding out1.toc because out1.pyz is missing
building PYZ out1.toc
checking PKG
rebuilding out3.toc because out3.pkg is missing
building PKG out3.pkg
checking ELFEXE
rebuilding out2.toc because helloworld.exe missing
building ELFEXE out2.toc
checking COLLECT
building out4.toc because out4.toc missing
building COLLECT out4.toc

Nach diesem Schritt existieren zwei weitere Verzeichnisse unterhalb von C:\Test:

C:\Test\buildhelloworld\ (wurde benutzt um die Dateien zusammenzuführen) C:\Test\disthelloworld\ (enthält jetzt das weiterzugebende Programm inklusive aller benötigten Bestandteile)

Den Inhalt des Ordners disthelloworld kann man nun weitergeben und auf jedem Windows-System ausführen.