Du hast ein erstes Programm geschrieben und nun möchtest du das Programm mit befreundeten Personen teilen oder sogar zum Verkauf veröffentlichen?
💡 Du lernst …
Die wenigsten Privatpersonen haben Python auf ihren Computer installiert und noch weniger werden verstehen, wie Sie dann mit PIP selbst Pakete installieren können, um dann deine Anwendung starten zu können. Für diese Fälle gibt es nützliche Tools wie PyInstaller, um eine ausführbare EXE für Windows oder eine App für macOS zu erstellen.
Egal, ob es sich um eine CLI Anwendung oder eine Anwendung mit Tkinter oder PyQt handelt, jede Anwendung lässt sich entsprechende zusammenpacken.
Wichtig ist das, wenn du eine App für macOS erstellen willst, benötigst du ein Gerät mit dem entsprechenden Betriebssystem. Das gilt auch für Windows und Linux, es ist immer das Betriebssystem notwendig auf dem du dein gebündeltes Programm zur Verfügung stellen willst.
Falls du Linux Varianten zur Verfügung stellen willst, könntest du zum Beispiel auch über ein Raspberry Pi das Ganze erstellen, falls du kein Linux installiert hast. Bei macOS wird es für die meisten schon schwierigere, wenn es nicht gerade ihr Hauptgerät ist, allerdings auch hierzu ein paar Tipps: Es gibt sogenannte „macOS in the Cloud“ Angebote von verschiedenen Anbieter diese stellen für eine gewisse Zeit dir dann ein Remote Zugang bereit und du kannst deine Python Software auch für Mac Nutzer zur Verfügung stellen. Diese ist zum Beispiel auch gängige Praxis bei App Entwicklern, die primäre untere Windows arbeiten wollen.
PyInstaller ist eine Bundler für Python Anwendungen. Alle notwendigen Abhängigkeiten werden zusammen gebündelt in einem Paket, das ausgeführt werden kann.
Standardmäßig wird ein Ordner erstellt, der eine ausführbare Datei enthält und weitere Abhängigkeiten, je nach Betriebssystem, eine UNIX Paket, eine APP Datei für macOS oder eine EXE für Windows Systeme. Für macOS Systeme kann auch für die 2 unterschiedlichen Prozessor Architekturen ein Universalpaket gebaut werden, oder explizit für x86_64, arm64. Zu beachten ist, dass die Python Version auch ein Universal Build ist.
PyInstaller kann einfach via PIP installiert werden und wird unterstützt ab Python Version 3.7.
pip install pyinstaller
pyenv ist das, was nvm für NodeJS ist. Und zwar ein Versionsmanagement für unterschiedliche Python Versionen. So kannst du zwischen Python 3.1 und 3.10 vollkommen einfach hin und her wechseln. Allerdings führt das beim Ausführen zu Fehlern, dann muss die Option —enable-framework
verwendet werden.
Unter https://github.com/pyenv/pyenv/wiki#debugging-pyenv findest du eine Anleitung.
Um nun eine ausführbare Datei erstellen zu können, benötigst du erst einmal ein Programm. Falls du kein eigenes hast, das sich gut zum Testen eignet, kannst du etwa mein Taschenrechner nehmen, den ich mit PyQt erstellt habe.
Nachdem du jetzt dein Projekt geöffnet hast und den PyInstaller installiert hast, kannst du auch schon starten.
Tipp für ein Icon: Benötigen wir auch noch ein hübsches Icon. Dafür habe ich eins mit der folgenden Figma Vorlage erstellt. Je nach Betriebssystem solltest du dich am entsprechenden Theme & Design orientieren.
pyinstaller main.py -y -w --icon=icon.png --onefile --add-data="style/calc.css:style" -n=Taschenrechner
Die Ausgabe sieht wie folgt aus, es werden die verschiedenen Versionen gebündelt, anschließende kannst du deine Taschenrechner.app
auch schon ausführen. Falls du eigene Dateien hast wie in meinem Fall eine CSS Datei so muss diese explizit noch einmal hinzugefügt werden, es können auch komplette Ordner hinzugefügt werden.
Wichtig hierbei ist, dass der Arbeitspfad nicht dem Pfad entspricht, wo die Daten liegen, diese kann über folgendes Snippet korrigiert werden. Im Optimalfall setz du dir das current_dir
einmal am Anfang deiner Software, damit du später darauf einfach zugreifen kannst.
current_dir = os.path.dirname(os.path.realpath(__file__))
filename = os.path.join(current_dir, "style/calc.css")
Der PyInstaller wird üblicherweise als CLI Tool ausgeführt, es können verschiedenstes Parameter gesetzt werden. Die gesetzten Parameter aus meinem Beispiel sind in der unten stehenden Tabelle erklärt.
-y
Verhindert, dass abgefragt wird, ob der Inhalt des Output-Verzeichnisses wirklich überschrieben werden soll.
-w |Â --windowed |Â --noconsole
Es wird eine Fensterapp erstellt. Bei macOS würde ansonsten nur eine Ausführbares Unix Paket erstellt werden. -w ergibt nur dann Sinn, wenn es sich um eine Fensteranwendung handelt, ansonsten sollte darauf verzichtet werden, da sonst keine Ausgabe zusehen ist.
-i | --icon
Eine Icon-Datei kann angegeben werden. Falls die Datei nicht dem Betriebssystem üblichen Format entspricht, frag pyinstaller danach Pillow zu installieren, um die Datei selbst zu übersetzen, in meinem Test hat diese hervorragend funktioniert.
Das Icon, das du für deine Anwendung definierst, würde ich immer in den Root Ordner legen, dann ist es direkt erreichbar.
-F | —onefile
Erstellt ein Bundle in einer Datei, diese ist nützlich für Portable Anwendungen. Die durch eine Datei ausgeführt werden soll. Ohne dass Verzeichnisse und Dateien behalten werden müssen. Ich bevorzuge immer diese Option, da es die Verwendung für den Anwender leichter macht.
Die Daten sind natürlich in diesem Fall auch enthalten und werden beim Ausführen temporär in einen privaten Ordner entpackt und danach wieder geschlossen.
--add-data <SRC;DEST or SRC:DEST>
Auf der Linken Seite wird die Quelle definiert und auf der Rechten das Ziel innerhalb des Paketes. Dort ist die Datei später aufzufinden. Diese Methode ist nützlich, wenn mit open zusätzliche Daten nachgeladen werden sollen. Unter UNIX Systemen ist der Separator zwischen der Linken und Rechten Seite meistens ein Doppelpunkt, unter Windows Systemen muss diese mit einem Semikolon erledigt werden.
-n | —name
Name der Anwendung, falls nicht gesetzt wird, der Name des Einstiegs Skriptes genommen. In unserem Beispiel von oben wär es dann „main“
Weitere Optionen kannst du hier finden: https://pyinstaller.org/en/stable/usage.html#options
Das Spec File ist ausführbarer Python Code und wird automatisch mit dem PyInstaller Befehle erstellt. Üblicherweise kannst du alle wichtigen Parameter mit dem PyInstaller selbst definieren.
Allerdings, wenn du viele verschiedene Daten hinzufügen willst oder auch DLL Dateien oder SO Dateien dann kann es sinnvoll sein diese über ein Spec File zu definieren. Oder du willst von deiner bestehenden Konfiguration ein neuen Build erstellen, da sich nur der Code geändert haben, aber nicht die Optionen selbst, dafür ist das Spec File ebenfalls nützlich, es ist sozusagen die Blaupause aus den definierten Optionen.
Mit dem Befehle pyi-makespec options main.py
kann die Spec Datei erstellt werden.
Mit dem Befehle pyinstaller specfile.spec
kann von einer bestehenden Spec File ein neuer Build erstellt werden, so können auch in der Spec File weitere Optionen ergänzt werden.
Diese ist eine sehr fortgeschrittene Technik damit zu arbeiten, für Details wirfst du am besten ein Blick in die offizielle Dokumentation: https://pyinstaller.org/en/stable/spec-files.html
PyInstaller ist ein sehr umfangreiches Tool, um Anwendungen für verschiedene Systeme zu bündel. Sodass auch Personen ohne Erfahrung in Python deine Anwendungen nutzen können.
Die fertige App für macOS findest du auch in der entsprechenden Repository, für Windows kann ich leider keine Testversion zur Verfügung stellen, mangelst Windows Gerätes um dies zu bauen. Allerdings da jetzt die Spec File dort vorhanden ist, kannst du mit den gleichen Optionen die Software Bundeln, falls du diese einmal Testen willst.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "PyInstaller – Ausführbare Python Programme erstellen!"!