Python, leistungsstark und vielseitig, wie es ist, fehlt ein paar Schlüsselfunktionen aus der Box. Zum einen bietet Python keinen nativen Mechanismus zum Kompilieren eines Python-Programms in ein eigenständiges ausführbares Paket.
Um fair zu sein, hat der ursprüngliche Anwendungsfall für Python niemals eigenständige Pakete aufgerufen. Python-Programme wurden im Großen und Ganzen auf Systemen ausgeführt, auf denen eine Kopie des Python-Interpreters lebte. Die wachsende Popularität von Python hat jedoch zu einer größeren Nachfrage nach Python-Apps auf Systemen ohne installierte Python-Laufzeit geführt.,
Mehrere Drittanbieter haben Lösungen für die Bereitstellung eigenständiger Python-Apps entwickelt. Die beliebteste Lösung des Bündels und die ausgereifteste ist PyInstaller. PyInstaller macht das Packen einer Python-App nicht völlig schmerzfrei, aber es geht einen langen Weg dorthin.
In diesem Artikel werden wir die Grundlagen der Verwendung von PyInstaller untersuchen, einschließlich der Funktionsweise von PyInstaller, der Verwendung von PyInstaller zum Erstellen einer eigenständigen ausführbaren Python-Datei, der Feinabstimmung der von Ihnen erstellten Python-ausführbaren Dateien und der Vermeidung einiger der häufigsten Fallstricke bei der Verwendung von PyInstaller.,
Erstellen eines PyInstaller-Pakets
PyInstaller ist ein Python-Paket, das mit pip
(pip install pyinstaller
) installiert wurde. PyInstaller kann in Ihrer Standard-Python-Installation installiert werden, es ist jedoch am besten, eine virtuelle Umgebung für das Projekt zu erstellen, das Sie packen möchten, und PyInstaller dort zu installieren.
PyInstaller liest Ihr Python-Programm, analysiert alle von ihm erstellten Importe und bündelt Kopien dieser Importe mit Ihrem Programm. PyInstaller liest Ihr Programm von seinem Einstiegspunkt aus ein., Wenn der Einstiegspunkt Ihres Programms beispielsweise myapp.py
, führen Sie aus, um die Analyse durchzuführen. PyInstaller kann viele gängige Python-Pakete wie NumPy erkennen und automatisch packen, aber in einigen Fällen müssen Sie möglicherweise Hinweise geben. (Mehr dazu später.)
Nachdem Sie Ihren Code analysiert und alle verwendeten Bibliotheken und Module gefunden haben, generiert PyInstaller eine „Spezifikationsdatei“.“Ein Python-Skript mit der Erweiterung .spec
diese Datei enthält Informationen darüber, wie Sie Ihre Python-app Bedürfnisse zu werden verpackt up., Wenn Sie PyInstaller zum ersten Mal in Ihrer App ausführen, generiert PyInstaller eine Spezifikationsdatei von Grund auf neu und füllt sie mit einigen vernünftigen Standardeinstellungen. Verwerfen Sie diese Datei nicht; Es ist der Schlüssel zum Verfeinern einer PyInstaller-Bereitstellung!
Schließlich versucht PyInstaller, eine ausführbare Datei aus der App zu erstellen, die mit all ihren Abhängigkeiten gebündelt ist. Wenn Sie fertig sind, wird ein Unterordner mit dem Namen dist
(standardmäßig können Sie einen anderen Namen angeben) im Projektverzeichnis angezeigt., Dies wiederum enthält ein Verzeichnis, das Ihre gebündelte App ist — es hat eine .exe
Datei zu laufen, zusammen mit allen Bibliotheken und anderen zusätzlichen Dateien erforderlich.
Alles, was Sie tun müssen, um Ihr Programm zu verteilen, ist, dieses Verzeichnis als .zip
– Datei oder ein anderes Bundle zu packen. Das Bundle muss normalerweise in einem Verzeichnis extrahiert werden, in dem der Benutzer Schreibberechtigungen hat, um ausgeführt zu werden.
Testen eines PyInstaller-Pakets
Es besteht eine gute Chance, dass Ihr erster Versuch, PyInstaller zum Verpacken einer App zu verwenden, nicht vollständig erfolgreich ist.
Um zu überprüfen, ob Ihr PyInstaller-Paket funktioniert, navigieren Sie zu dem Verzeichnis, das die gebündelte ausführbare Datei enthält, und führen Sie dort die Datei .exe
über die Befehlszeile aus., Wenn es nicht ausgeführt wird, sollten die Fehler, die in der Befehlszeile gedruckt werden, einen Hinweis darauf geben, was falsch ist.
Der häufigste Grund, warum ein PyInstaller-Paket fehlschlägt, ist, dass PyInstaller eine erforderliche Datei nicht bündeln konnte. Solche fehlenden Dateien fallen in einige Kategorien:
- Versteckte oder fehlende Importe: Manchmal kann PyInstaller den Import eines Pakets oder einer Bibliothek nicht erkennen, normalerweise, weil es dynamisch importiert wird. Das Paket oder die Bibliothek muss manuell angegeben werden.,
- Fehlende eigenständige Dateien: Wenn das Programm von externen Datendateien abhängt, die mit dem Programm gebündelt werden müssen, kann PyInstaller dies nicht wissen. Sie müssen die Dateien manuell einschließen.
- Fehlende Binärdateien: Auch hier, wenn Ihr Programm von einer externen Binärdatei wie a abhängt .DLL, die PyInstaller nicht erkennen kann, müssen Sie es manuell einschließen.
Die gute Nachricht ist, dass PyInstaller eine einfache Möglichkeit bietet, mit den oben genannten Problemen umzugehen., Die von PyInstaller erstellte.spec
– Datei enthält Felder, die wir ausfüllen können, um die Details anzugeben, die PyInstaller verpasst hat.
Öffnen Sie die .spec
– Datei in einem Texteditor und suchen Sie nach der Definition des Analysis
– Objekts. Einige der Parameter, die an Analysis
übergeben werden, sind leere Listen, können jedoch bearbeitet werden, um die fehlenden Details anzugeben:
-
hiddenimports
Für versteckte oder fehlende Importe: Fügen Sie dieser Liste eine oder mehrere Zeichenfolgen mit den Namen der Bibliotheken hinzu, die Sie in Ihre App aufnehmen möchten., Wenn Sie beispielsweisepandas
und hinzufügen möchten, geben Sie dies alsan. Beachten Sie, dass die fraglichen Bibliotheken in derselben Instanz von Python installiert sein müssen, in der Sie PyInstaller ausführen.
-
datas
für fehlende eigenständige Dateien: Fügen Sie hier eine oder mehrere Spezifikationen für Dateien in Ihrem Projektbaum hinzu, die Sie in Ihr Projekt aufnehmen möchten., Jede Datei muss als Tupel übergeben werden, das den relativen Pfad zur Datei in Ihrem Projektverzeichnis und den relativen Pfad innerhalb des Verteilungsverzeichnisses angibt, in dem Sie die Datei platzieren möchten. Wenn Sie beispielsweise eine Datei./models/mainmodel.dat
, die Sie in Ihre App aufnehmen möchten, und Sie sie in einem passenden Unterverzeichnis in Ihrem Verteilungsverzeichnis ablegen möchten, verwenden Sie('./models/mainmodel.dat','./models')
als einen Eintrag in der Listehiddenimports
. Beachten Sie, dass Sieglob
-style wildcards verwenden können, um mehr als eine Datei anzugeben., -
binaries
für fehlende eigenständige Binärdateien: Wie bei können Siebinaries
verwenden, um eine Liste von Tupeln zu übergeben, die die Speicherorte von Binärdateien im Projektbaum und ihre Ziele im Verteilungsverzeichnis angeben. Wieder, können Sieglob
Stil wildcards.
Beachten Sie, dass jede der an Analysis
übergebenen Listen programmgesteuert früher in der .spec
– Datei generiert werden kann., Schließlich ist die .spec
Datei nur ein Python-Skript mit einem anderen Namen.
Nachdem Sie Änderungen an der Datei .spec
vorgenommen haben, führen Sie PyInstaller erneut aus, um das Paket neu zu erstellen. Stellen Sie jedoch von nun an sicher, dass Sie die geänderte Datei .spec
als Parameter übergeben (z. B. pyinstaller myapp.spec
). Testen Sie die ausführbare Datei, wie zuvor. Wenn noch etwas kaputt ist, können Sie die .spec
Datei erneut bearbeiten und den Vorgang wiederholen, bis alles funktioniert.,
Wenn Sie zufrieden sind, dass alles wie beabsichtigt funktioniert, möchten Sie möglicherweise die Datei .spec
bearbeiten, um zu verhindern, dass Ihre verpackte App beim Start ein Befehlszeilenfenster anzeigt. Setzen Sie in den EXE
– Objekteinstellungen in der .spec
– Datei console=False
. Das Unterdrücken der Konsole ist nützlich, wenn Ihre App über eine GUI verfügt und Sie kein falsches Befehlszeilenfenster möchten, das Benutzer in die Irre führt. Ändern Sie diese Einstellung natürlich nicht, wenn Ihre App eine Befehlszeile benötigt.,
Verfeinern eines PyInstaller-Pakets
Sobald Sie Ihre App mit PyInstaller gepackt haben und ordnungsgemäß ausgeführt werden, möchten Sie sie wahrscheinlich ein wenig verkleinern. PyInstaller-Pakete sind nicht als svelte bekannt.
Da Python eine dynamische Sprache ist, ist es schwierig vorherzusagen, was zur Laufzeit von einem bestimmten Programm benötigt wird. Wenn PyInstaller einen Paketimport erkennt, enthält PyInstaller daher alles in diesem Paket, unabhängig davon, ob es tatsächlich zur Laufzeit von Ihrem Programm verwendet wird oder nicht.
Hier ist die gute Nachricht., PyInstaller enthält einen Mechanismus zum selektiven Ausschließen ganzer Pakete oder einzelner Namespaces innerhalb von Paketen. Angenommen, Ihr Programm importiert das Paket foo
, das foo.bar
und foo.bip
enthält. Wenn Sie wissen, dass Ihr Programm nur Logik in foo.bar
, können Sie foo.bip
sicher ausschließen und etwas Platz sparen.
Dazu verwenden Sie den Parameter excludes
, der an das Objekt Analysis
in der Datei .spec
übergeben wird., Sie können eine Liste von Namen — Module der obersten Ebene oder gepunktete Namespaces-übergeben, um sie von Ihrem Paket auszuschließen. Um beispielsweise foo.bip
auszuschließen, geben Sie einfach an.
Ein häufiger Ausschluss, den Sie vornehmen können, ist tkinter
, die Python-Bibliothek zum Erstellen einfacher plattformübergreifender grafischer Benutzeroberflächen. Standardmäßig tkinter
und alle seine Support-Dateien sind mit einem PyInstaller-Projekt gepackt. Wenn Sie tkinter
in Ihrem Projekt nicht verwenden, können Sie es ausschließen, indem Sie 'tkinter'
zur Liste excludes
hinzufügen. Das Weglassen von tkinter
verringert die Größe des Pakets um etwa 7 MB.
Ein weiterer häufiger Ausschluss sind Testsuiten., Wenn ein Paket, das Ihr Programm importiert, über eine Testsuite verfügt, wird die Testsuite möglicherweise in Ihr PyInstaller-Paket aufgenommen. Wenn Sie die Testsuite nicht tatsächlich in Ihrem bereitgestellten Programm ausführen, können Sie sie sicher ausschließen.
Beachten Sie, dass Pakete, die mit Ausschlüssen erstellt wurden, vor der Verwendung gründlich getestet werden sollten. Wenn Sie Funktionen ausschließen, die in einem zukünftigen Szenario verwendet werden, das Sie nicht erwartet haben, wird Ihre App unterbrochen.
PyInstaller-Tipps
- Erstellen Sie Ihr PyInstaller-Paket auf dem Betriebssystem, auf dem Sie bereitstellen möchten., PyInstaller unterstützt keine plattformübergreifenden Builds. Wenn Sie Ihre eigenständige Python-App auf macOS -, Linux-und Windows-Systemen bereitstellen müssen, müssen Sie PyInstaller installieren und separate Versionen der App auf jedem dieser Betriebssysteme erstellen.
- Erstellen Sie Ihr PyInstaller-Paket, während Sie Ihre App entwickeln. Sobald Sie wissen, dass Sie Ihr Projekt mit PyInstaller bereitstellen, erstellen Sie Ihre
.spec
– Datei und verfeinern Sie das PyInstaller-Paket parallel zur Entwicklung Ihrer App., Auf diese Weise können Sie während des Schreibens Ausschlüsse oder Einschlüsse hinzufügen und testen, wie neue Funktionen mit der App bereitgestellt werden. - Verwenden Sie den
--onefile
– Modus von PyInstaller nicht. PyInstaller enthält einen Befehlszeilenschalter--onefile
, der Ihre gesamte App in eine einzelne selbstextrahierende ausführbare Datei packt. Das klingt nach einer tollen Idee — Sie müssen nur eine Datei liefern! — aber es hat einige Fallstricke. Wenn Sie die App ausführen, müssen zuerst alle Dateien in der ausführbaren Datei in ein temporäres Verzeichnis entpackt werden., Wenn die App groß ist (z. B. 200 MB), kann das Auspacken eine Verzögerung von mehreren Sekunden bedeuten. Verwenden Sie stattdessen den standardmäßigen Einzelverzeichnismodus und packen Sie einfach alles als.zip
– Datei ein. - Erstellen Sie ein Installationsprogramm für Ihre PyInstaller app. Wenn Sie eine andere Möglichkeit zum Bereitstellen Ihrer App als a wünschen .zip-Datei, erwägen Sie die Verwendung eines Installationsprogramms wie das Open Source Nullsoft Scriptable Install System. Es fügt sehr wenig Overhead auf die Größe des lieferbaren und können Sie viele Aspekte des Installationsprozesses konfigurieren, wie Verknüpfungen zu Ihrer ausführbaren Datei zu erstellen.,
- Erwarten Sie keine Beschleunigungen. PyInstaller ist ein Verpackungssystem, kein Compiler oder Optimierer. Mit PyInstaller gepackter Code wird nicht schneller ausgeführt als auf dem Originalsystem. Wenn Sie Python-Code beschleunigen möchten, verwenden Sie eine für die Aufgabe geeignete C-beschleunigte Bibliothek oder ein Projekt wie Cython.,wie man Python beschleunigt
- So installieren Sie Python auf intelligente Weise
- Besseres Python-Projektmanagement mit Python
- Virtualenv und venv: Python virtual environments explained
- Python virtualenv und venv do ’s und don‘ ts
- Python Threading und Subprozesse explained
- So verwenden Sie den Python-Debugger
- So verwenden Sie timeit, um Python-Code zu profilieren
- So verwenden Sie cProfile zum Profilieren von Python-Code
- Erste Schritte mit async in Python
- So verwenden Sie asyncio in Python
- So konvertieren Sie Python in JavaScript (und wieder zurück)