Übersetzer |. Li Rui
Rezensent |. Da Python immer beliebter wird, werden seine Grenzen immer offensichtlicher. Einerseits kann es sehr schwierig sein, Python-Anwendungen zu schreiben und sie an Personen zu verteilen, die Python nicht installiert haben.
Der häufigste Weg, dieses Problem zu lösen, besteht darin, das Programm mit allen unterstützenden Bibliotheken und Dateien sowie der Python-Laufzeit zu packen. Es gibt Tools, die dies können, wie zum Beispiel PyInstaller, aber sie erfordern viel Caching, um richtig zu funktionieren. Darüber hinaus ist es häufig möglich, den Quellcode eines Python-Programms aus dem generierten Paket zu extrahieren. In manchen Fällen kann dies ein Deal Breaker sein.
Das Drittprojekt Nuitka bietet eine radikale Lösung. Es kompiliert ein Python-Programm in eine C-Binärdatei – nicht durch Packen der CPython-Laufzeitumgebung mit dem Programmbytecode, sondern durch die Übersetzung von Python-Anweisungen in C. Die Ergebnisse können in einem komprimierten Paket verteilt oder zusammen mit anderen Produkten von Drittanbietern in ein Installationsprogramm gepackt werden.
Nuitka versucht außerdem, maximale Kompatibilität mit dem Python-Ökosystem aufrechtzuerhalten, damit Bibliotheken von Drittanbietern wie NumPy zuverlässig funktionieren können. Wo immer möglich, nimmt Nuitka auch Leistungsverbesserungen an kompilierten Python-Programmen vor, jedoch ohne Einbußen bei der Gesamtkompatibilität. Beschleunigungen können nicht garantiert werden, daher schwanken sie stark zwischen den Arbeitslasten, und bei einigen Programmen kommt es möglicherweise nicht zu nennenswerten Leistungsverbesserungen. Im Allgemeinen ist es am besten, sich hinsichtlich der Leistung nicht auf Nuitka zu verlassen, sondern auf eine gebündelte Lösung.
Nuitka installieren
Für jede Plattform ist neben der Python-Laufzeit auch ein C-Compiler erforderlich. Unter Microsoft Windows wird Visual Studio 2022 oder höher empfohlen, es kann aber auch MinGW-w64 C11 (gcc 11.2 oder höher) verwendet werden. Für andere Plattformen können Sie gcc 5.1 oder höher, g++4.4 oder höher, clang oder clang cl unter Windows unter Visual Studio verwenden.
Es ist wichtig zu beachten, dass bei Verwendung von Python 3.3 oder Python 3.4 aufgrund von Toolabhängigkeiten Python 2.7 erforderlich ist. All dies sollten Gründe sein, nach Möglichkeit die neueste Version von Python zu verwenden.
Am besten installieren Sie Nuitka zusammen mit Ihrem Projekt in einer virtuellen Umgebung als Entwicklungsabhängigkeit und nicht als Distributionsabhängigkeit. Nuitka selbst wird nicht mit Projekten gebündelt oder von diesen verwendet; es führt die Bündelung durch.
Nuitka zum ersten Mal verwenden
Das erste, was ein Entwickler mit Nuitka tun möchte, ist zu überprüfen, ob die gesamte Toolchain, einschließlich des C-Compilers, ordnungsgemäß funktioniert. Um dies zu testen, können Sie ein einfaches Python-Programm „Hallo Welt“ kompilieren und es main.py nennen:
print ("Hello world")
Wenn Sie ein Python-Programm mit Nuitka kompilieren, übergeben Sie den Namen des Einstiegspunktmoduls als Argument an Nuitka, For Beispiel Nuitka main.py. Bei einem solchen Aufruf empfängt Nuitka main.py und erstellt daraus eine ausführbare Datei.
Da wir nur die Funktionalität von Nuitka testen, ist zu beachten, dass die Python-Datei nur in eine ausführbare Datei kompiliert wird. Es kompiliert nichts anderes und bündelt auch nichts zur Weiterverbreitung. Aber das Kompilieren einer Datei sollte ausreichen, um festzustellen, ob die Toolchain von Nuitka richtig eingerichtet ist.
Nach Abschluss der Kompilierung sollten Sie die ausführbare Binärdatei im selben Verzeichnis wie das Python-Programm sehen. Führen Sie die ausführbare Datei aus, um sicherzustellen, dass sie ordnungsgemäß funktioniert.
Es ist auch möglich, mit Nuitka kompilierte Anwendungen automatisch auszuführen, indem --run als Befehlszeilenflag übergeben wird.
Wenn die ausführbare Testdatei „Hallo Welt“ funktioniert, können Sie versuchen, sie als weitervertreibbare Datei zu packen. Dieser Vorgang wird im Folgenden erläutert.
Es ist wichtig zu beachten, dass es beim Ausführen der ersten Testkompilierung mit Nuitka einige Sekunden dauern kann, bis sie abgeschlossen ist. Und dadurch wird nur ein Modul kompiliert, nicht das gesamte Programm. Das Kompilieren eines vollständigen Programms mit Nuitka kann je nach Anzahl der vom Programm verwendeten Module mehrere Minuten oder länger dauern.
Kompilieren Sie Python-Programme mit Nuitka.
Stellen Sie sich ein modifiziertes „Hello world“-Programm mit einem angrenzenden Modul namens „greet.py:
def greet(name): print ("Hello ", name)
“ und einem modifizierten main.py:
import greet greet.greet("world")
vor. Um diese beiden Module zu kompilieren, können Sie Folgendes verwenden: Imports-Schalter:
nuitka --follow-imports main.py
Dieser Schalter stellt sicher, dass alle vom gesamten Programm benötigten Importe aus der Importanweisung befolgt und zusammen kompiliert werden.
Eine weitere Option –nofollow-import-to ermöglicht es, bestimmte Unterverzeichnisse vom Importvorgang auszuschließen. Diese Option ist nützlich, um Testsuiten oder Module herauszufiltern, von denen Sie wissen, dass sie noch nie verwendet wurden. Es ermöglicht auch die Bereitstellung von Platzhaltern als Parameter.
图1.使用Nuitka编译大型复杂程序。这个示例涉及编译Pyglet模块以及标准库中的许多模块,这需要几分钟的时间
(1)包括动态导入
现在出现了Python用户在尝试打包Python应用程序以进行分发时经常遇到的问题之一。--follow-imports选项仅遵循通过import语句在代码中显式声明的导入。它不处理动态导入。
为了解决这个问题,可以使用--include-plugin-directory开关为动态导入的模块提供一个或多个路径。例如,对于包含动态导入代码的名为mods的目录,可以使用:
nuitka--follow-imports--include-plugin-directory=modsmain.py
(2)包括数据文件和目录
如果Python程序使用在运行时加载的数据文件,Nuitka也无法自动检测这些文件。要将单个文件和目录包含在Nuitka打包程序中,可能使用--include-data-files和--include-data-dir。
--include-data-files允许为要复制的文件指定通配符以及要将它们复制到的位置。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。
-include-data-dir的工作方式大致相同,只是它不使用通配符;它只允许传递要复制的路径和要将其复制到的分发文件夹中的目标。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。
(3)包括Python包和模块
指定导入的另一种方法是使用Python样式的包命名空间而不是文件路径,使用--include-package选项。例如,以下命令将包括mypackage,它在磁盘上的任何位置(假设Python可以找到它),以及它下面的所有内容:
nuitka --include-package=mypackage main.py
如果包需要自己的数据文件,可以使用--include-package-data选项包含这些文件:
nuitka --include-package=mypackage --include-package-data=mypackage main.py
该命令告诉Nuitka获取包目录中实际上不是代码的所有文件。
如果只想包含单个模块,可以使用--include-module:
nuitka --include-module=mypackage.mymodule main.py
该命令告诉Nuitka只包含mypackage.mymodule,而不包含其他内容。
当想用Nuitka编译Python程序以进行重新分发时,可以使用命令行开关--standalone来处理大部分工作。此开关自动跟随所有导入并生成一个dist文件夹,其中包含已编译的可执行文件和所需的任何支持文件。要重新分发程序,只需要复制此目录即可。
不要指望--standalone的程序在第一次运行时就可以工作。Python程序的一般动态性几乎保证了需要使用上述其他一些选项来确保编译的程序正常运行。例如,如果有一个需要特定字体的GUI应用程序,可能必须使用--include-data-files或--include-data-dir将它们复制到发行版中。
此外,如上所述,--standalone应用程序的编译时间可能比测试编译长得多。一旦对测试独立构建的应用程序需要多长时间有所了解,就为测试独立构建的应用程序所需的构建时间进行预算。
最后,Nuitka提供了另一个构建选项--onefile。对于那些熟悉PyInstaller的人来说,--onefile的工作方式与该程序中的相同选项相同:它将整个应用程序(包括其所有依赖文件)压缩为单个可执行文件,无需重新分发其他文件。但是,重要的是要知道--onefile在Linux和Microsoft Windows上的工作方式不同。在Linux上,它使用存档的内容安装一个虚拟文件系统。在Windows上,它会将文件解压缩到一个临时目录中并从那里运行它们,它必须为程序的每次运行执行这一操作。在Windows上使用--onefile可能会显著降低启动程序所需的时间。
原文标题:Intro to Nuitka: A better way to compile and distribute Python,作者:Serdar Yegulalp
Das obige ist der detaillierte Inhalt vonEinführung in Nuitka: Eine bessere Möglichkeit, Python zu kompilieren und zu verteilen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!