当前位置: 首页 > 科技观察

Nuitka简介:编译和分发Python的更好方法_0

时间:2023-03-14 12:13:18 科技观察

Nuitka简介:编译和分发Python的更好方法一方面,编写Python应用程序并将它们分发给没有安装Python的人可能非常困难。解决此问题的最常见方法是将程序及其所有支持库和文件以及Python运行时打包在一起。有一些工具可以执行此操作,例如PyInstaller,但它们需要大量缓存才能正常工作。更重要的是,通常可以从生成的包中提取Python程序的源代码。在某些情况下,这可能会破坏交易。第三方项目Nuitka提供了一个激进的解决方案。它将Python程序编译成C语言二进制文件——不是通过将CPython运行时与程序字节码打包在一起,而是通过将Python指令翻译成C。结果可以作为压缩包分发或与其他第三方产品一起打包到安装程序中。Nuitka还试图保持与Python生态系统的最大兼容性,因此像NumPy这样的第三方库可以可靠地工作。Nuitka还在不牺牲整体兼容性的情况下,尽可能提高已编译Python程序的性能。但加速并不能保证,因此它们在工作负载之间差异很大,并且某些程序可能不会体验到任何明显的性能改进。一般来说,最好不要依赖Nuitka来提高性能,而是作为一个捆绑解决方案。安装NuitkaNuitka适用于Python2.6至2.7以及Python3.3至3.10。它可以为MicrosoftWindows、macOS、Linux和FreeBSD/NetBSD编译二进制文件。请注意,开发人员必须在目标平台上构建二进制文件;交叉编译是不可能的。对于每个平台,除了Python运行时之外,还需要一个C编译器。在MicrosoftWindows上,建议使用VisualStudio2022或更高版本,但也可以使用MinGW-w64C11(gcc11.2或更高版本)。对于其他平台,您可以在Windows下的VisualStudio下使用gcc5.1或更高版本g++4.4或更高版本、clang或clangcl。请注意,如果使用Python3.3或Python3.4,由于工具依赖性,将需要Python2.7。如果可以的话,所有这些都应该是使用最新版本Python的理由。最好将Nuitka与您的项目一起安装在虚拟环境中,作为开发依赖项而不是分发依赖项。Nuitka本身不与项目捆绑或使用;它执行捆绑。第一次使用Nuitka安装Nuitka后,使用Nuitka或python-mnuitka调用它。开发人员想要使用Nuitka做的第一件事是验证整个工具链是否正常工作,包括C编译器。要对此进行测试,请编译一个简单的“Helloworld”Python程序,将其命名为main.py:例如Nuitkamain.py。当这样调用时,Nuitka将获取main.py并从中构建一个可执行文件。需要注意的是,由于只是测试Nuitka的功能,所以只会将Python文件编译成可执行文件。它不编译任何其他东西,也不捆绑任何东西以供重新分发。但是编译一个文件应该足以确定Nuitka的工具链是否设置正确。编译完成后,您应该会在与Python程序相同的目录中看到二进制可执行文件。运行可执行文件以确保其正常工作。也可以通过将--run作为命令行标志传递来自动运行Nuitka编译的应用程序。如果“Helloworld”测试可执行文件有效,您可以尝试将其打包为可再分发文件。这个过程解释如下。请注意,当使用Nuitka运行第一个测试编译时,它可能会在几秒钟内完成。而且这只编译了一个模块,而不是整个程序。使用Nuitka编译一个完整的程序可能需要几分钟或更长时间,具体取决于程序使用的模块数量。使用Nuitka编译Python程序默认情况下,Nuitka只编译指定的模块。如果模块从程序的其他地方、标准库或第三方包导入,则需要指定也应编译这些导入。考虑修改后的“Helloworld”程序,它有一个名为greet.py的相邻模块:defgreet(name):print("Hello",name)和修改后的main.py:importgreetgreet.greet("world")来编译两者模块,可以使用--follow-imports开关:nuitka--follow-importsmain.py这个开关确保整个程序所需的所有导入都遵循导入语句并一起编译。另一个选项--nofollow-import-to允许从导入过程中排除特定的子目录。此选项对于过滤掉已知永远不会使用的测试套件或模块很有用。它还允许提供通配符作为参数。图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-datadir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据中。-include-data-dir的工作方式大致相同,只是它不使用通配符;它只允许传递要复制的路径和要将其复制到的分发文件夹中的目标。例如,--include-datadir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据中。(3)包含Python包和模块另一种指定导入的方法是使用Python风格的包命名空间而不是文件路径,使用--include-package选项。例如,以下命令将包括mypackage,它在磁盘上的任何位置(假设Python可以找到它),以及它下面的所有内容:nuitka--include-package=mypackagemain.py如果包需要它自己的数据文件,您可以使用--include-package-data选项来包含这些文件:实际上代码。如果你只想包含一个模块,你可以使用--include-module:nuitka--include-module=mypackage.mymodulemain.py这个命令告诉Nuitka只包含mypackage.mymodule而没有别的。编译Python程序进行再发布当你想用Nuitka编译Python程序进行再发布时,你可以使用命令行开关--standalone来处理大部分工作。此开关自动跟随所有导入并生成一个dist文件夹,其中包含已编译的可执行文件和所需的任何支持文件。要重新分发该程序,只需复制该目录即可。不要指望--standalone的程序在第一次运行时就可以工作。Python程序的一般动态特性几乎保证需要使用上面提到的其他一些选项来确保编译的程序正确运行。例如,如果您有一个需要特定字体的GUI应用程序,您可能必须使用--include-data-files或--include-data-dir将它们复制到发行版中。此外,如上所述,--standalone应用程序编译可能比测试编译花费更长的时间。一旦您知道测试独立构建的应用程序需要多长时间,就可以为测试独立构建的应用程序所需的构建时间做预算。最后,Nuitka提供了另一个构建选项——onefile。对于那些熟悉PyInstaller的人来说,--onefile的工作方式与该程序中的相同选项相同:它将整个应用程序(包括其所有依赖文件)压缩为单个可执行文件,而无需重新分发其他文件。但是,重要的是要知道--onefile在Linux和MicrosoftWindows上的工作方式不同。在Linux上,它使用存档的内容安装虚拟文件系统。在Windows上,它将文件提取到一个临时目录中并从那里运行它们,它必须为程序的每次运行执行此操作。在Windows上使用--onefile可能会显着减少启动程序所需的时间。原标题:Nuitka简介:编译和分发Python的更好方法,作者:SerdarYegulalp