Dieses Dokument wird als erste Lektüre empfohlen, wenn Sie mit der Verwendung von Nuitka beginnen. Auf dieser Seite erfahren Sie mehr über die Nuitka -Grundlagen, wie z. B. Lizenztyp, Anwendungsfälle, Anforderungen und Credits.
Inhaltsverzeichnis
Anforderungen
Verwendung
Tutorial zum Einrichten und Erstellen unter Windows
Anwendungsfälle
Optimierungen
Typische Probleme
Tipps
Zusammenstellungsbericht
Leistung
Nicht unterstützte Funktionalität
Nuitka ist der Python-Compiler. Es ist in Python geschrieben. Es ist ein nahtloser Ersatz oder eine Erweiterung des Python-Interpreters und kompiliert jedes Konstrukt, das Python 2 (2.6, 2.7) und Python 3 (3.4 – 3.13) haben, wenn es selbst mit dieser Python-Version ausgeführt wird.
Anschließend führt es unkompilierten Code und kompilierten Code zusammen auf äußerst kompatible Weise aus.
Sie können alle Python-Bibliotheksmodule und alle Erweiterungsmodule frei nutzen.
Nuitka übersetzt die Python-Module in ein C-Level-Programm, das dann libpython
und eigene statische C-Dateien verwendet, um es auf die gleiche Weise wie CPython auszuführen.
Jede Optimierung zielt darauf ab, Overhead dort zu vermeiden, wo er unnötig ist. Keines zielt darauf ab, die Kompatibilität zu beseitigen, obwohl gelegentlich leichte Verbesserungen vorgenommen werden, bei denen nicht jeder Fehler von Standard-Python emuliert wird, z. B. werden ausführlichere Fehlermeldungen ausgegeben, aber es gibt einen vollständigen Kompatibilitätsmodus, um selbst das zu deaktivieren.
Um einen reibungslosen Betrieb von Nuitka zu gewährleisten, stellen Sie sicher, dass Sie die Systemanforderungen befolgen, die die folgenden Komponenten umfassen:
C-Compiler
Python
Betriebssystem
Architektur
Sie benötigen einen C-Compiler mit Unterstützung für C11 oder alternativ einen C++-Compiler für C++03 [1].
Derzeit bedeutet dies, dass Sie einen dieser Compiler verwenden müssen:
Der MinGW64 C11-Compiler unter Windows muss auf gcc 11.2 oder höher basieren. Es wird automatisch heruntergeladen, wenn kein verwendbarer C-Compiler gefunden wird. Dies ist die empfohlene Installationsmethode, da Nuitka es auch für Sie aktualisiert.
Visual Studio 2022 oder höher unter Windows [2]. Englisches Sprachpaket für beste Ergebnisse (Nuitka filtert fehlerhafte Ausgaben heraus, aber nur für die englische Sprache). Es wird standardmäßig verwendet, wenn es installiert ist.
Auf allen anderen Plattformen der gcc
Compiler mindestens Version 5.1, darunter alternativ der g++
-Compiler mindestens Version 4.4.
Der clang
Compiler auf macOS X und den meisten FreeBSD-Architekturen.
Unter Windows kann der clang-cl
-Compiler unter Windows verwendet werden, sofern er vom Visual Studio-Installationsprogramm bereitgestellt wird.
[1] | Unterstützung für dieses C11 wird mit gcc 5.x oder höher oder einer beliebigen Clang-Version gegeben. Die älteren MSVC-Compiler tun dies noch nicht. Um dieses Problem zu umgehen: Bei Python 3.10 oder älter überschneidet sich der C++03-Sprachstandard erheblich mit C11 und wird stattdessen verwendet. |
[2] | Laden Sie es kostenlos herunter von https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx (die Community-Editionen funktionieren einwandfrei). Die neueste Version wird empfohlen, ist aber nicht erforderlich. Andererseits ist die Unterstützung von Versionen vor Windows 10 nicht erforderlich, und diese funktionieren möglicherweise für Sie, die Unterstützung dieser Konfigurationen steht jedoch nur kommerziellen Benutzern zur Verfügung. |
Python 2 (2.6, 2.7) und Python 3 (3.4 – 3.13) werden unterstützt. Sollte es zu irgendeinem Zeitpunkt eine stabile Python-Version geben, die nicht in dieser Liste enthalten ist, können Sie sicher sein, dass daran gearbeitet wird und hinzugefügt wird.
Wichtig
Für Python 3.4 und nur diese Version benötigen wir eine andere Python-Version als Abhängigkeit zur Kompilierungszeit .
Nuitka selbst ist mit allen aufgeführten Versionen vollständig kompatibel, Scons als intern verwendetes Tool jedoch nicht.
Für diese Versionen müssen Sie auch Python2 oder Python 3.5 oder höher installiert haben, jedoch nur während der Kompilierungszeit. Dies dient der Verwendung mit Scons (das die C-Kompilierung orchestriert), das nicht dieselben Python-Versionen wie Nuitka unterstützt.
Außerdem kann Python2 unter Windows nicht verwendet werden, da clcache
damit nicht funktioniert, dort muss ein Python 3.5 oder höher installiert sein.
Nuitka findet diese benötigten Python-Versionen (z. B. unter Windows über die Registrierung) und Sie sollten es nicht bemerken, solange sie installiert sind.
Zunehmend sind andere Funktionen verfügbar, wenn ein anderes Python ein bestimmtes Paket installiert hat. Beispielsweise funktioniert die Onefile-Komprimierung für Python 2.x, wenn ein anderes Python gefunden wird, auf dem das zstandard
Paket installiert ist.
Binärdateien auf andere Maschinen verschieben
Die erstellten Binärdateien können mit den Optionen --standalone
und --onefile
unabhängig von der Python-Installation ausführbar gemacht werden.
Suffix für binären Dateinamen
Die erstellten Binärdateien haben unter Windows das Suffix .exe
. Auf anderen Plattformen haben sie kein Suffix für den Standalone-Modus oder das Suffix .bin
, das Sie entfernen oder ändern oder mit der Option -o
angeben können.
Das Suffix für den Beschleunigungsmodus wird nur hinzugefügt, um sicherzustellen, dass der ursprüngliche Skriptname und der Binärname niemals kollidieren, sodass wir die Binärdatei sicher überschreiben können, ohne die ursprüngliche Quelldatei zu zerstören.
Es muss CPython, Anaconda Python oder Homebrew sein
Sie benötigen die Standard-Python-Implementierung namens „CPython“, um Nuitka auszuführen, da diese eng mit den Implementierungsdetails verknüpft ist.
Es kann nicht aus dem Windows App Store stammen
Es ist bekannt, dass Python im Windows App Store definitiv nicht funktioniert, es wird dagegen überprüft.
Unter macOS kann es nicht pyenv sein
Es ist bekannt, dass macOS „pyenv“ nicht funktioniert. Verwenden Sie stattdessen Homebrew für selbst kompilierte Python-Installationen. Beachten Sie jedoch, dass der Standalone-Modus auf diesen Plattformen schlechter ist und nicht so abwärtskompatibel mit älteren macOS-Versionen ist.
Unterstützte Betriebssysteme: Linux, FreeBSD, NetBSD, macOS und Windows (32 Bit/64 Bit/ARM).
Andere werden auch funktionieren. Es wird erwartet, dass die Portabilität im Allgemeinen gut ist, aber z. B. die interne Scons-Nutzung von Nuitka muss möglicherweise angepasst werden oder es müssen Flags übergeben werden. Stellen Sie sicher, dass die Python- und C-Compiler-Architektur übereinstimmen, sonst erhalten Sie kryptische Fehlermeldungen.
Unterstützte Architekturen sind x86, x86_64 (AMD64) und Arm, wahrscheinlich viele, viele mehr.
Es wird erwartet, dass auch andere Architekturen sofort funktionieren, da Nuitka im Allgemeinen keine Hardware-Spezifika verwendet. Dies sind nur diejenigen, die getestet wurden und sich als gut erwiesen haben. Feedback ist willkommen. Im Allgemeinen können die von Debian unterstützten Architekturen als gut und getestet angesehen werden.
Die empfohlene Art, Nuitka auszuführen, ist <the_right_python> -m nuitka
um absolut sicher zu sein, welchen Python-Interpreter Sie verwenden, damit es einfacher ist, ihn mit dem abzugleichen, was Nuitka hat.
Die nächstbeste Möglichkeit, Nuitka ohne Änderungen auszuführen, ist das Auschecken oder Archivieren einer Quelle, ohne Änderungen an Umgebungsvariablen. Am bemerkenswertesten ist, dass Sie sich für Nuitka überhaupt nicht mit PYTHONPATH
herumschlagen müssen. Sie führen einfach die Skripte nuitka
und nuitka-run
direkt aus, ohne Änderungen an der Umgebung vorzunehmen. Der Einfachheit halber möchten Sie möglicherweise das bin
-Verzeichnis zu Ihrem PATH
hinzufügen, dieser Schritt ist jedoch optional.
Wenn Sie außerdem mit dem richtigen Interpreter ausführen möchten, stellen Sie in diesem Fall sicher, dass Sie <the_right_python> bin/nuitka
ausführen und gut sind.
Wählen Sie den richtigen Dolmetscher
Wenn Sie auf einen SyntaxError
stoßen, haben Sie höchstwahrscheinlich den falschen Interpreter für das Programm ausgewählt, das Sie kompilieren.
Nuitka verfügt über die Option --help
, um auszugeben, was es tun kann:
nuitka – Hilfe
Der Befehl nuitka-run
ist derselbe wie nuitka
, jedoch mit einer anderen Standardeinstellung. Es versucht, ein Python-Skript zu kompilieren und direkt auszuführen:
nuitka-run --help
Diese andere Option ist --run
und übergibt Argumente nach der ersten Nicht-Option an die erstellte Binärdatei. Sie ähnelt also etwas mehr dem, was einfaches python
tun wird.
Für die meisten Systeme gibt es Pakete auf der Download-Seite von Nuitka. Sie können es aber auch wie oben beschrieben aus dem Quellcode installieren, es kann aber auch wie jedes andere Python-Programm über die normale python setup.py install
installiert werden.
Hinweis: Für die Integration mit GitHub-Workflows gibt es diese Nuitka-Action, die Sie verwenden sollten, um die Integration wirklich einfach zu machen. Sie sollten zwar mit einer lokalen Kompilierung beginnen, dies ist jedoch für die plattformübergreifende Kompilierung mit Nuitka am einfachsten.
Nuitka ist unter der Apache-Lizenz, Version 2.0, lizenziert. Sie dürfen es nur in Übereinstimmung mit der Lizenz verwenden.
Sie können eine Kopie der Lizenz unter http://www.apache.org/licenses/LICENSE-2.0 erhalten
Sofern nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, wird die im Rahmen der Lizenz vertriebene Software „WIE BESEHEN“ und OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend, vertrieben. Die spezifische Sprache, die die Berechtigungen und Einschränkungen im Rahmen der Lizenz regelt, finden Sie in der Lizenz.
Dies sind grundlegende Schritte, wenn Sie nichts installiert haben. Wenn Sie eines der Teile haben, überspringen Sie es natürlich einfach.
Laden Sie Python von https://www.python.org/downloads/windows herunter und installieren Sie es
Wählen Sie ein Windows x86-64 web-based installer
(64-Bit-Python, empfohlen) oder x86 executable
Installationsprogramm (32-Bit-Python) aus.
Überprüfen Sie mit dem Befehl python --version
, ob es funktioniert.
python -m pip install nuitka
Überprüfen Sie dies mit dem Befehl python -m nuitka --version
mkdir
HelloWorld
Erstellen Sie eine Python-Datei mit dem Namen hello.py
def talk(message):return "Talk " + messagedef main():print(talk("Hello World"))if __name__ == "__main__":main()
Machen Sie es so, wie Sie es normalerweise tun würden. Das Ausführen von Nuitka mit Code, der nicht ordnungsgemäß funktioniert, ist nicht einfacher zu debuggen.
Python hallo.py
python -m jetzt hello.py
Notiz
Dadurch werden Sie aufgefordert, ein C-Caching-Tool (um die wiederholte Kompilierung des generierten C-Codes zu beschleunigen) und einen MinGW64-basierten C-Compiler herunterzuladen, sofern Sie kein geeignetes MSVC installiert haben. Beantworten Sie beide Fragen yes
.
Führen Sie die hello.exe
aus, die in der Nähe von hello.py
erstellt wurde.
Erstellen Sie zum Verteilen mit der Option --standalone
, die nicht eine einzelne ausführbare Datei, sondern einen ganzen Ordner ausgibt. Kopieren Sie den resultierenden Ordner hello.dist
auf den anderen Computer und führen Sie ihn aus.
Sie können auch --onefile
ausprobieren, wodurch eine einzelne Datei erstellt wird. Stellen Sie jedoch sicher, dass die eigenständige Datei funktioniert, bevor Sie sie verwenden, da dies das Debuggen nur erschwert, z. B. bei fehlenden Datendateien.
Wenn Sie ein ganzes Programm rekursiv kompilieren möchten und nicht nur die einzelne Datei, die das Hauptprogramm darstellt, gehen Sie folgendermaßen vor:
python -m neu --follow-imports program.py
Notiz
Es stehen detailliertere Steuerelemente als --follow-imports
zur Verfügung. Betrachten Sie die Ausgabe von nuitka --help
. Wenn Sie weniger Module in die Kompilierung einbeziehen, dafür aber normales Python verwenden, wird die Kompilierung schneller.
Falls Sie ein Quellverzeichnis mit dynamisch geladenen Dateien haben, also eines, das nicht durch Rekursion nach normalen Importanweisungen über den PYTHONPATH
gefunden werden kann (was die empfohlene Methode wäre), können Sie jederzeit verlangen, dass ein bestimmtes Verzeichnis auch in das Verzeichnis einbezogen wird ausführbar:
python -m neu --follow-imports --include-plugin-directory=plugin_dir program.py
Notiz
Wenn Sie keine dynamischen Importe durchführen, sollten Sie einfach Ihren PYTHONPATH
zur Kompilierungszeit festlegen.
Verwenden Sie --include-plugin-directory
nur, wenn Sie __import__()
-Aufrufe durchführen, die Nuitka nicht vorhersagen kann und die aus einem Verzeichnis stammen. Verwenden Sie für alles aus Ihrer Python-Installation --include-module
oder --include-package
.
Notiz
Der resultierende Dateiname lautet unter Windows program.exe
und auf anderen Plattformen program.bin
. Mit --output-filename
lässt sich dieser jedoch ändern.
Notiz
Die resultierende Binärdatei hängt immer noch davon ab, dass CPython und verwendete C-Erweiterungsmodule installiert sind.
Wenn Sie es auf einen anderen Computer kopieren möchten, verwenden Sie --standalone
, kopieren Sie das erstellte Verzeichnis program.dist
und führen Sie die darin eingefügte Datei program.exe
(Windows) bzw. program
(andere Plattformen) aus.
Wenn Sie ein einzelnes Erweiterungsmodul kompilieren möchten, müssen Sie lediglich Folgendes tun:
python -m neu --module some_module.py
Die resultierende Datei some_module.so
kann dann anstelle von some_module.py
verwendet werden.
Wichtig
Der Dateiname des erzeugten Erweiterungsmoduls darf nicht geändert werden, da Python auf einer vom Modulnamen abgeleiteten Funktion als Einstiegspunkt besteht. In diesem Fall wird PyInit_some_module
und das Umbenennen der Datei daran nichts ändern. Passen Sie den Dateinamen des Quellcodes an den Binärnamen an.
Notiz
Wenn sich sowohl das Erweiterungsmodul als auch der Quellcode davon im selben Verzeichnis befinden, wird das Erweiterungsmodul geladen. Änderungen am Quellcode werden erst wirksam, wenn Sie sie erneut kompilieren.
Notiz
Die Option --follow-import-to
funktioniert ebenfalls, aber die enthaltenen Module werden erst importierbar, nachdem Sie den Namen some_module
importiert haben. Wenn diese Art von Importen für Nuitka unsichtbar sind, z. B. dynamisch erstellt werden, können Sie in diesem Fall --include-module
oder --include-package
verwenden, für statische Importe sollte dies jedoch nicht erforderlich sein.
Notiz
Ein Erweiterungsmodul kann niemals andere Erweiterungsmodule umfassen. Damit dies möglich ist, müssen Sie ein Rad erstellen.
Notiz
Das resultierende Erweiterungsmodul kann nur in ein CPython derselben Version geladen werden und enthält keine anderen Erweiterungsmodule.
Wenn Sie ein ganzes Paket kompilieren und alle Module einbetten müssen, ist das auch machbar, verwenden Sie Nuitka wie folgt:
python -m neu --module some_package --include-package=some_package
Notiz
Die Einbindung des Paketinhalts muss manuell erfolgen; Ansonsten ist die Packung größtenteils leer. Wenn Sie möchten, können Sie genauer sein und nur einen Teil davon einschließen oder einen Teil davon ausschließen, z. B. mit --nofollow-import-to='*.tests'
würden Sie den nicht verwendeten Testteil Ihres Codes nicht einschließen.
Notiz
Datendateien, die sich im Paket befinden, werden durch diesen Prozess nicht eingebettet, Sie müssen sie bei diesem Ansatz selbst kopieren. Alternativ können Sie die Dateieinbettung von Nuitka Commercial nutzen.
Für die Verteilung auf andere Systeme gibt es den Standalone-Modus, der einen Ordner erzeugt, für den Sie --standalone
angeben können.
python -m neu --standalone program.py
Die Verfolgung aller Importe ist in diesem Modus die Standardeinstellung. Sie können Module selektiv ausschließen, indem Sie ausdrücklich --nofollow-import-to
sagen, aber dann wird ein ImportError
ausgelöst, wenn zur Programmlaufzeit versucht wird, sie zu importieren. Dies kann zu unterschiedlichem Verhalten führen, kann aber bei kluger Vorgehensweise auch Ihre Kompilierzeit verkürzen.
Um Datendateien einzubinden, verwenden Sie die Option --include-data-files=<source>=<target>
, wobei die Quelle ein Dateisystempfad ist, das Ziel jedoch relativ angegeben werden muss. Für den Standalone-Modus können Sie sie auch manuell kopieren, allerdings können dadurch zusätzliche Prüfungen durchgeführt werden, und für den Onefile-Modus ist kein manuelles Kopieren möglich.
Um einige oder alle Dateien in ein Verzeichnis zu kopieren, verwenden Sie die Option --include-data-files=/etc/*.txt=etc/
Hier können Sie Shell-Muster für die Dateien angeben und ein Unterverzeichnis angeben, in dem sie abgelegt werden sollen durch den abschließenden Schrägstrich.
Wichtig
Nuitka berücksichtigt keinen Datendateicode, schließt keine DLLs oder Python-Dateien als Datendateien ein und erwartet, dass sie funktionieren, es sei denn, Sie wissen wirklich, was Sie tun.
Als Nicht-Code-Datendateien gelten im Folgenden alle Dateien, die keines dieser Kriterien erfüllen.
Suffix | Begründung | Lösung |
---|---|---|
.py | Nuitka kürzt sogar die einzubindenden stdlib-Module. Wenn kein Python-Code angezeigt wird, werden keine Abhängigkeiten analysiert und es funktioniert daher einfach nicht. | Verwenden Sie stattdessen --include-module für sie |
.pyc | Identisch mit .py . | Verwenden Sie stattdessen --include-module für sie aus ihrem Quellcode. |
.pyo | Identisch mit .pyc . | Verwenden Sie stattdessen --include-module für sie aus ihrem Quellcode. |
.pyw | Identisch mit .py . | Um mehrere Programme einzuschließen, verwenden Sie stattdessen mehrere --main Argumente. |
.pyi | Diese werden ignoriert, da sie codeähnlich sind und zur Laufzeit nicht benötigt werden. Für das lazy -Paket, das tatsächlich von ihnen abhängen würde, haben wir eine Kompilierzeitlösung entwickelt, die diese Notwendigkeit beseitigt. | Melden Sie ein Problem, wenn Software von Drittanbietern dies benötigt. |
.pyx | Diese werden ignoriert, da es sich um Cython-Quellcode handelt, der zur Laufzeit nicht verwendet wird | |
.dll | Diese werden ignoriert, da es sich in der Regel nicht um Datendateien handelt. Für die Fälle, in denen Pakete von Drittanbietern sie tatsächlich als Daten verwenden, z. B. .NET -Pakete, lösen wir das in der Paketkonfiguration dafür. | Erstellen Sie für diese eine Nuitka-Paketkonfiguration mit dll Abschnitt für das Paket, das sie verwendet. In seltenen Fällen kann ein Datendateiabschnitt mit spezieller Konfiguration die richtige Lösung sein. |
.dylib | Diese werden ignoriert, da es sich um macOS-Erweiterungsmodule oder DLLs handelt. | Es muss eine Konfiguration mit dll Abschnitt oder fehlenden depends hinzugefügt werden |
.so | Diese werden ignoriert, da es sich um Erweiterungsmodule oder DLLs für Linux, BSD usw. handelt. | Es muss eine Konfiguration mit dll Abschnitt oder fehlenden depends hinzugefügt werden |
.exe | Das sind Binärdateien für Windows. | Sie können die Nuitka-Paketkonfiguration hinzufügen, um diese als DLLs einzuschließen und sie als executable: yes |
.bin | Es handelt sich um Binärdateien für Nicht-Windows, ansonsten identisch mit .exe . |
Außerdem werden Ordner ignoriert. Dabei handelt es sich um site-packages
, dist-packages
und vendor-packages
, die andernfalls eine vollständige virtuelle Umgebung enthalten würden, was nie gut ist. Und der Ordner __pycache__
wird ebenfalls immer ignoriert. Unter Nicht-MacOS wird die Datei .DS_Store
ebenfalls ignoriert, und py.typed
Ordner haben nur für IDEs eine Bedeutung und werden wie .pyi
Dateien ignoriert.
Um einen ganzen Ordner mit allen Nicht-Code-Dateien zu kopieren, können Sie --include-data-dir=/path/to/images=images
verwenden, wodurch diese im Ziel abgelegt werden. Wenn Sie möchten, können Sie auch --noinclude-data-files
verwenden. --noinclude-data-files
-Option, um sie zu entfernen. Codedateien sind wie oben beschrieben DLLs, ausführbare Dateien, Python-Dateien usw. und werden ignoriert. Für diese können Sie das Formular --include-data-files=/binaries/*.exe=binary/
verwenden, um sie zu erzwingen. Dies wird jedoch nicht empfohlen und verursacht bekanntermaßen Probleme zur Laufzeit.
Für Paketdaten gibt es einen besseren Weg, nämlich die Verwendung von --include-package-data
, das alle Nicht-Code-Datendateien von Paketen automatisch erkennt und kopiert. Es akzeptiert sogar Muster im Muschelstil. Es erspart Ihnen die Suche nach dem Paketverzeichnis selbst und sollte, sofern verfügbar, bevorzugt werden. Funktionell ist es --include-data-dir
sehr ähnlich, hat aber den Vorteil, dass es den richtigen Ordner für Sie findet.
Mit Datendateien sind Sie weitgehend auf sich allein gestellt. Nuitka verfolgt diejenigen, die von beliebten Paketen benötigt werden, ist jedoch möglicherweise unvollständig. Sprechen Sie Probleme an, wenn Sie darin auf etwas stoßen. Noch besser: Erhöhen Sie die PRs durch Verbesserungen der Nuitka-Paketkonfiguration. Wir möchten, dass Software von Drittanbietern sofort funktioniert.
Wenn das funktioniert, können Sie bei Bedarf den Onefile-Modus verwenden.
python -m neu --onefile program.py
Dadurch wird eine einzelne Binärdatei erstellt, die sich selbst auf dem Ziel extrahiert, bevor das Programm ausgeführt wird. Beachten Sie jedoch, dass der Zugriff auf Dateien in Bezug auf Ihr Programm beeinträchtigt ist. Lesen Sie daher unbedingt auch den Abschnitt Onefile: Dateien finden.
# Erstellen Sie eine Binärdatei, die in einen temporären Ordner entpackt wird. Python -m nuitka --onefile program.py
Notiz
Es gibt weitere plattformspezifische Optionen, z. B. im Zusammenhang mit Symbolen, Begrüßungsbildschirm und Versionsinformationen. Einzelheiten hierzu finden Sie in der Ausgabe von --help
und im Abschnitt „Optimierungen“.
Für das Entpacken wird standardmäßig ein eindeutiger temporärer Benutzerpfad verwendet und dann gelöscht. Dieser Standardwert --onefile-tempdir-spec="{TEMP}/onefile_{PID}_{TIME}"
kann jedoch mit einem Pfad überschrieben werden Spezifikation, dann einen zwischengespeicherten Pfad verwenden und wiederholtes Entpacken vermeiden, z. B. mit --onefile-tempdir-spec="{CACHE_DIR}/{COMPANY}/{PRODUCT}/{VERSION}"
was Verwendet Versionsinformationen und ein benutzerspezifisches Cache-Verzeichnis.
Notiz
Die Verwendung zwischengespeicherter Pfade ist beispielsweise dann relevant, wenn die Windows-Firewall ins Spiel kommt, da sonst die Binärdatei bei jeder Ausführung eine andere ist.
Derzeit sind diese erweiterten Token verfügbar:
Token | Was dies bedeutet | Beispiel |
---|---|---|
{TEMP} | Temporäres Dateiverzeichnis des Benutzers | C:Benutzer...AppDataLocalsTemp |
{PID} | Prozess-ID | 2772 |
{ZEIT} | Zeit in Sekunden seit der Epoche. | 1299852985 |
{PROGRAMM} | Vollständiger Programmlaufzeitdateiname der ausführbaren Datei. | C:SomeWhereYourOnefile.exe |
{PROGRAM_BASE} | Kein Suffix des Laufzeitdateinamens der ausführbaren Datei. | C:SomeWhereYourOnefile |
{CACHE_DIR} | Cache-Verzeichnis für den Benutzer. | C:UsersSomeBodyAppDataLocal |
{UNTERNEHMEN} | Wert angegeben als --company-name | IhrFirmenname |
{PRODUKT} | Wert angegeben als --product-name | IhrProduktname |
{VERSION} | Kombination aus --file-version und --product-version | 3.0.0.0-1.0.0.0 |
{HEIM} | Home-Verzeichnis für den Benutzer. | /home/jemand |
{KEINER} | Wenn für Dateiausgaben bereitgestellt, wird None verwendet | siehe Hinweis unten |
{NULL} | Wenn für Dateiausgaben bereitgestellt, wird os.devnull verwendet | siehe Hinweis unten |
Wichtig
Es liegt in Ihrer Verantwortung, den angegebenen Pfad eindeutig zu machen. Unter Windows wird ein laufendes Programm gesperrt, und obwohl die Verwendung eines festen Ordnernamens möglich ist, kann es in diesem Fall zu Sperrproblemen kommen, wenn das Programm neu gestartet wird.
Normalerweise müssen Sie {TIME}
oder zumindest {PID}
verwenden, um einen Pfad eindeutig zu machen. Dies ist hauptsächlich für Anwendungsfälle gedacht, bei denen Sie beispielsweise möchten, dass sich Dinge an einem von Ihnen gewählten Ort befinden oder Ihre Namenskonventionen einhalten.
Wichtig
Zum Deaktivieren von Ausgabe und stderr mit --force-stdout-spec
und --force-stderr-spec
erreichen die Werte {NONE}
und {NULL}
dies, jedoch mit unterschiedlicher Wirkung. Mit {NONE}
wird das entsprechende Handle zu None
. Infolgedessen ist beispielsweise sys.stdout
None
, was sich von {NULL}
unterscheidet, wo es durch eine Datei gestützt wird, die auf os.devnull
zeigt, d. h. Sie können darauf schreiben.
Mit {NONE}
können Sie beispielsweise RuntimeError: lost sys.stdout
erhalten, falls es verwendet wird; mit {NULL}
passiert das nie. Einige Bibliotheken verarbeiten dies jedoch als Eingabe für ihren Protokollierungsmechanismus, und unter Windows sind Sie auf diese Weise mit pythonw.exe
kompatibel, das sich wie {NONE}
verhält.
Wenn Sie über eine setup.py
, setup.cfg
oder pyproject.toml
-gesteuerte Erstellung von Rädern für Ihre Software verfügen, ist die Verwendung von Nuitka äußerst einfach.
Beginnen wir mit dem gebräuchlichsten setuptools
-Ansatz: Sie können, wenn Nuitka natürlich installiert ist, einfach das Ziel bdist_nuitka
anstelle von bdist_wheel
ausführen. Es umfasst alle Optionen und ermöglicht Ihnen die Angabe einiger weiterer Nuitka-spezifischer Optionen.
# Für setup.py, wenn Sie keine anderen Build-Systeme verwenden:setup( # Datendateien müssen von setuptools und nicht von Nuitka verarbeitet werden package_data={"some_package": ["some_file.txt"]}, ..., # Hiermit werden Nuitka-Optionen übergeben. command_options={ 'nuitka': { # boolesche Option, z. B. wenn Sie sich für C-Kompilierungsbefehle interessieren '--show-scons': True, # Optionen ohne Wert, z. B. mit Clang erzwingen '--clang': Keine, # Optionen mit einzelne Werte, z. B. ein Plugin von Nuitka aktivieren '--enable-plugin': "pyside2", # Optionen mit mehreren Werten, z. B. das Einschließen von Modulen vermeiden '--nofollow-import-to': ["*.tests", "*.distutils"], }, }, )# Für setup.py mit anderen Build-Systemen:# Die Tupelnatur der Argumente ist durch die dunkle Natur von# „setuptools“ und Plugins dazu erforderlich, die auf vollständige Kompatibilität bestehen,# z. B. „setuptools_rust“setup( # Datendateien sollen von setuptools und nicht von Nuitka verwaltet werden package_data={"some_package": ["some_file.txt"]}, ..., # Hiermit werden Nuitka-Optionen übergeben. ..., command_options={ 'nuitka': { # boolesche Option, z. B. wenn Sie sich für C-Kompilierungsbefehle interessieren '--show-scons': ("setup.py", True), # Optionen ohne Wert, z. B. erzwingen using Clang '--clang': ("setup.py", None), # Optionen mit einzelnen Werten, z. B. ein Plugin von Nuitka aktivieren '--enable-plugin': ("setup.py", "pyside2"), # Optionen mit mehreren Werten, Vermeiden Sie beispielsweise die Einbeziehung der Module '--nofollow-import-to': ("setup.py", ["*.tests", "*.distutils"]), } }, )
Wenn Sie das Ziel aus irgendeinem Grund nicht ändern können oder wollen, können Sie dies zu Ihrer setup.py
hinzufügen.
# Für setup.pysetup( ..., build_with_nuitka=True)
Notiz
Um die Kompilierung vorübergehend zu deaktivieren, können Sie die obige Zeile entfernen oder den Wert in False
bearbeiten oder den Wert einer Umgebungsvariablen entnehmen, wenn Sie dies wünschen, z. B. bool(os.getenv("USE_NUITKA", "True"))
. Das liegt an Ihnen.
Oder Sie könnten es in Ihre setup.cfg
einfügen
[metadata]build_with_nuitka = true
Und zu guter Letzt unterstützt Nuitka auch das neue build
-Meta. Wenn Sie also bereits eine pyproject.toml
haben, ersetzen oder fügen Sie einfach diesen Wert hinzu:
[build-system]requires = ["setuptools>=42", "wheel", "nuitka", "toml"]build-backend = "nuitka.distutils.Build"# Datendateien müssen von setuptools und nicht von Nuitka verarbeitet werden [tool.setuptools.package-data]some_package = ['data_file.txt'] [tool.nuitka]# Diese werden nicht empfohlen, machen aber deutlich, dass sie Wirkung haben.# boolesche Option, z. B. wenn Sie sich für C-Kompilierungsbefehle interessieren, werden führende# Bindestriche weggelassenshow-scons = true# Optionen mit einzelnen Werten, z. B. enable ein Plugin von Nuitkaenable-plugin = "pyside2"# Optionen mit mehreren Werten, z. B. das Einschließen von Modulen vermeiden, akzeptiert# list argument.nofollow-import-to = ["*.tests", „*.distutils“]
Notiz
Für die nuitka
-Anforderung über absolute Pfade wie C:Users...Nuitka
funktioniert auch unter Linux. Verwenden Sie einen absoluten Pfad mit zwei führenden Schrägstrichen, z. B. //home/.../Nuitka
.
Notiz
Welchen Ansatz Sie auch wählen, die Datendateien in diesen Rädern werden überhaupt nicht von Nuitka, sondern von Setuptools verwaltet. Sie können jedoch die Datendateieinbettung von Nuitka Commercial nutzen. In diesem Fall würden Sie die Dateien tatsächlich in das Erweiterungsmodul selbst einbetten und nicht als Datei im Rad.
Wenn Sie über mehrere Programme verfügen, von denen jedes ausführbar sein sollte, mussten Sie in der Vergangenheit alle Programme mehrmals kompilieren und bereitstellen. Im Standalone-Modus bedeutete dies natürlich, dass Sie ziemlich verschwenderisch waren, da das Teilen der Ordner zwar möglich war, aber von Nuitka nicht wirklich unterstützt wurde.
Geben Sie Multidist
ein. Es gibt eine Option --main
, die das angegebene Positionsargument ersetzt oder ergänzt. Und es kann mehrmals gegeben werden. Bei mehrfacher Angabe erstellt Nuitka eine Binärdatei, die den Code aller angegebenen Programme enthält, jedoch die darin verwendeten Module gemeinsam nutzt. Sie müssen daher nicht mehrfach verteilt werden.
Nennen wir den Basisnamen des Hauptpfads und den Einstiegspunkt. Die Namen dieser müssen natürlich unterschiedlich sein. Dann kann die erstellte Binärdatei jeden Einstiegspunkt ausführen und reagiert auf das, was ihr sys.argv[0]
erscheint. Wenn es also richtig ausgeführt wird (mit etwas wie subprocess
oder einer Betriebssystem-API können Sie diesen Namen steuern), oder indem Sie die Binärdatei umbenennen oder kopieren oder eine symbolische Verknüpfung damit herstellen, können Sie das Wunder vollbringen.
Dadurch ist es möglich, sehr unterschiedliche Programme zu einem zu kombinieren.
Notiz
Diese Funktion ist noch experimentell. Seien Sie vorsichtig und melden Sie Ihre Ergebnisse, wenn Sie auf unerwünschtes Verhalten stoßen
Dieser Modus funktioniert mit Standalone, Onefile und reiner Beschleunigung. Im Modulmodus funktioniert es nicht.
Für die Integration mit GitHub-Workflows gibt es diese Nuitka-Action, die Sie verwenden sollten, die die Integration wirklich einfach macht. Sie sollten zwar mit einer lokalen Kompilierung beginnen, dies ist jedoch für die plattformübergreifende Kompilierung mit Nuitka am einfachsten.
Dies ist ein Beispielworkflow, der auf allen drei Betriebssystemen aufbaut
jobs:build: Strategie: Matrix: Betriebssystem: [macos-latest, ubuntu-latest, Windows-latest] läuft weiter: ${{matrix.os }} Schritte: - Name: Auscheck-Repository verwendet: actions/checkout@v4 - Name: Setup Python verwendet: actions/setup-python@v5 mit: Python-Version: '3.10' Cache: 'pip' Cache-Abhängigkeitspfad: | **/requirements*.txt – Name: Installieren Sie Ihre Abhängigkeiten, führen Sie Folgendes aus: | pip install -r Anforderungen.txt -r Anforderungen-dev.txt - Name: Ausführbare Datei mit Nuitka erstellen verwendet: Nuitka/Nuitka-Action@main mit: Nuitka-Version: Hauptskriptname: your_main_program.py # viele weitere Nuitka-Optionen verfügbar , siehe Aktionsdokument, aber es ist am besten, nuitka-project:-Optionen in Ihrem Code zu verwenden, damit Sie beispielsweise # einen Unterschied für macOS machen und dort ein App-Bundle erstellen können. onefile: true – Name: Upload Artifacts verwendet: actions/upload-artifact@v3 mit: Name: ${{ runner.os }} Build-Pfad: | # stimmt mit dem überein, was für die 3 Betriebssysteme erstellt wurde: build/*.exe build/*.bin build/*.app/**/*
Wenn es sich bei Ihrer App um eine GUI handelt, sollte your_main_program.py
beispielsweise diese Kommentare enthalten, wie in den Nuitka-Optionen im Code erläutert, da dies unter macOS dann ein Bundle sein sollte.
# Kompilierungsmodus, überall eigenständig, außer unter macOS gibt es App Bundle# nuitka-project-if: {OS} in ("Windows", "Linux", "FreeBSD"):# nuitka-project: --onefile# nuitka-project -if: {OS} == "Darwin":# nuitka-project: --standalone# nuitka-project: --macos-create-app-bundle#
Für ein gutes Aussehen können Sie Symbole angeben. Unter Windows können Sie eine Symboldatei, eine ausführbare Vorlagendatei oder eine PNG-Datei bereitstellen. All dies funktioniert und kann sogar kombiniert werden:
# Diese erstellen Binärdateien mit Symbolen auf Windowspython -m nuitka --onefile --windows-icon-from-ico=your-icon.png program.py python -m neu --onefile --windows-icon-from-ico=your-icon.ico program.py python -m neu --onefile --windows-icon-template-exe=your-icon.ico program.py# Diese erstellen Anwendungspakete mit Symbolen auf macOSpython -m neu --macos-create-app-bundle --macos- app-icon=your-icon.png program.py python -m neu --macos-create-app-bundle --macos-app-icon=your-icon.icns program.py
Notiz
Mit Nuitka müssen Sie keine plattformspezifischen Icons erstellen, sondern es konvertiert beispielsweise PNG, aber auch andere Formate im Handumdrehen während des Builds.
Berechtigungen für ein macOS-Anwendungspaket können mit der Option --macos-app-protected-resource
hinzugefügt werden. Alle Werte werden auf dieser Seite von Apple aufgelistet
Ein Beispielwert wäre --macos-app-protected-resource=NSMicrophoneUsageDescription:Microphone access
zum Anfordern des Zugriffs auf ein Mikrofon. Nach dem Doppelpunkt ist der beschreibende Text anzugeben.
Notiz
Beachten Sie, dass Sie im wahrscheinlichen Fall der Verwendung von Leerzeichen im Beschreibungsteil diese in Anführungszeichen setzen müssen, damit Ihre Shell zu Nuitka durchdringt und nicht als Nuitka-Argumente interpretiert wird.
Unter Windows wird die Konsole nicht von Programmen geöffnet, es sei denn, Sie sagen es. Nuitka zeigt es standardmäßig nicht an, Sie können es jedoch mit --console=force
erzwingen, dann öffnet das Programm ein neues Terminalfenster, wenn es ausgeführt wird.
Begrüßungsbildschirme sind nützlich, wenn der Programmstart langsam ist. Der Onefile-Start selbst ist nicht langsam, aber Ihr Programm kann es sein, und Sie können nicht wirklich wissen, wie schnell der verwendete Computer sein wird, daher ist es möglicherweise eine gute Idee, sie zu haben. Glücklicherweise können sie mit Nuitka ganz einfach für Windows hinzugefügt werden.
Für den Begrüßungsbildschirm müssen Sie ihn als PNG-Datei angeben und dann sicherstellen, dass Sie den Begrüßungsbildschirm deaktivieren, wenn Ihr Programm bereit ist, z. B. die Importe abgeschlossen, das Fenster vorbereitet, eine Verbindung zur Datenbank hergestellt hat und den Begrüßungsbildschirm möchte weggehen. Hier verwenden wir die Projektsyntax, um den Code mit der Erstellung zu kombinieren. Kompilieren Sie Folgendes:
# nuitka-project: --onefile# nuitka-project: --onefile-windows-splash-screen-image={MAIN_DIRECTORY}/Splash-Screen.png# Was auch immer das ist, offensichtlichprint("Startverzögerung um 10 Sekunden..." )import time, tempfile, ostime.sleep(10)# Verwenden Sie diesen Code, um die Entfernung des Begrüßungsbildschirms zu signalisieren.if „NUITKA_ONEFILE_PARENT“ in os.environ: Splash_filename = os.path.join( tempfile.gettempdir(), "onefile_%d_splash_feedback.tmp" % int(os.environ["NUITKA_ONEFILE_PARENT"]), ) if os.path.exists(splash_filename): os.unlink(splash_filename)print("Fertig... Splash sollte verschwunden sein.") ...# Der Rest Ihres Programms kommt hierher.
Zur Analyse Ihres Programms und der Nuitka-Verpackung steht Ihnen der Compilation Report zur Verfügung. Sie können auch benutzerdefinierte Berichte erstellen, indem Sie Ihre Vorlage bereitstellen. Einige davon sind in Nuitka integriert. Diese Berichte enthalten alle Detailinformationen, z. B. wenn versucht wurde, ein Modul zu importieren, aber nicht gefunden wurde, können Sie sehen, wo das passiert. Für die Fehlerberichterstattung wird dringend empfohlen, den Bericht bereitzustellen.
Sie können Ihrer Zusammenstellung Urheberrechts- und Markeninformationen, Firmennamen, Produktnamen usw. beifügen. Dies wird dann in den Versionsinformationen für die erstellte Binärdatei unter Windows oder das Anwendungspaket unter macOS verwendet. Wenn Ihnen etwas fehlt, teilen Sie uns dies bitte mit.
Standardmäßig wird Nuitka ohne --deployment
kompiliert, was eine Reihe von Schutzmaßnahmen und Helfern aktiviert lässt, die darauf abzielen, falsche Verwendungen von Nuitka zu debuggen.
Dies ist eine neue Funktion und implementiert eine Reihe von Schutzmaßnahmen und Hilfsfunktionen, die hier dokumentiert sind.
Nach der Zusammenstellung ist sys.executable
der kompilierte binäre. Bei Paketen -m module_name
multiprocessing
, joblib
-c command
loky
ist python
sys.executable
zu erwarten Starten Sie einen anderen Code vorübergehend oder dauerhaft als Service -Daemon.
Mit Nuitka führt dies jedoch Ihr Programm erneut aus und setzt diese Argumente in sys.argv
, wo Sie sie vielleicht ignorieren, und dann geben Sie sich erneut, um die Helfer -Daemons zu starten. Manchmal laich dies CPU -Zählerprozesse, die CPU -Zählerprozesse hervorbringen, die ... dies als Gabelbombe genannt wird, und mit fast allen Systemen, die sie leicht zu Tode einfrieren.
Deshalb geschieht dies mit Standard -Nuitka:
./hello.dist/hello.bin -l fool -m foom -n foon -o fooo -p Fehler, das Programm versuchte sich mit dem Argument von '-m' zu rufen. Deaktivieren Sie mit "-No-Deployment-Flag = Selbsterklärung".
Ihr Programm kann durchaus eine eigene Befehlszeile analysieren und nicht ein nicht unterstütztes Paket verwenden, das versucht, sich erneut auszunehmen. In diesem Fall müssen Sie zum Kompilieren der Zeit für die Nutzung --no-deployment-flag=self-execution
die diesen spezifischen Wachmann deaktiviert, verwenden.
Einige Pakete geben das aus, was sie für hilfreiche Informationen darüber ausgeben, was der Grund für einen fehlgeschlagenen Import bedeuten könnte. Bei kompilierten Programmen ist sehr oft einfach falsch. Wir versuchen, diese im Nichteinlagenmodus zu reparieren. Hier ist ein Beispiel, bei dem wir eine Nachricht ändern, die auf die Installation von PIP -Installationen (das nicht das Problem ist) geändert wird, um den Benutzer auf den Befehl einzufügen, der ein imageio
-Plugin funktioniert.
- Modulname: 'Imageio.core.imopen' ' Anti-Bloat: -Ersatz_plain: '`pip installieren imageio [{config.install_name}]`, um es zu installieren': '`--include-module = {config.module_name}` mit nuitka, um es zu iT''er_type = Importerror': 'ERR_TYPE = einbezieht RunTimeError 'Wenn:' Nicht -Einsatz '
Der Bereitstellungsmodus ist relativ neu und hat ständig mehr Funktionen hinzugefügt, z. B. etwas für FileNotFoundError
sollte in Kürze stattfinden.
All diese Helfer können natürlich gleichzeitig mit --deployment
deaktiviert werden, aber denken Sie daran, dass Sie es zum Debuggen vielleicht wieder aufnehmen möchten. Möglicherweise möchten Sie Nuitka -Projektoptionen und eine Umgebungsvariable verwenden, um dies bedingt zu machen.
Sollten Sie sie alle deaktivieren?
Wir glauben, dass die Deaktivierung nur selektiv auftreten sollte, aber bei PYPI -Upgrades, Ihre Codeänderungen können alle diese Probleme wieder einschalten. Die räumliche Einsparung des Bereitstellungsmodus ist derzeit vernachlässigbar. Wenn Sie wissen, dass es Sie nicht beeinflussen kann oder wenn dies der Fall ist, benötigen Sie es nicht. Einige der zukünftigen, werden eindeutig auf die Verwendung von Anfängerniveau ausgerichtet sein.
Bei Windows mit Standardeinstellungen von Nuitka wurden Binärdateien und keine weiteren Aktionen von einigen AV -Anbietern als Malware erfasst. Dies ist vermeidbar, aber nur in Nuitka Commercial gibt es tatsächliche Unterstützung und Anweisungen dafür, wie dies zu tun ist, und sehen Sie dies als einen typischen nur kommerziellen Bedarf an. https://nuitka.net/doc/commercial.html
Für Linux Standalone ist es ziemlich schwierig, eine Binärdatei zu bauen, die auf anderen Linux -Versionen funktioniert. Dies liegt hauptsächlich daran, dass auf Linux viel Software speziell auf konkrete DLLs erstellt wurde. Dinge wie GLIBC verwendet, werden dann in den binären Binärbauton kodiert und es wird nicht mit einem älteren Glibc laufen, nur um ein kritisches Beispiel zu geben.
Die Lösung besteht darin, auf dem ältesten Betriebssystem zu bauen, das Sie unterstützt sehen möchten. Das Auswählen und das Einrichten kann mühsam sein, kann sich also anmelden und es behalten