Python 打包工具 Nuitka 入门指南
温馨提示:这篇文章已超过406天没有更新,请注意相关的内容是否还可用!
Nuitka是什么?
nuitka是一个用来将python代码打包为exe可执行文件,方便其在没有相关环境的windows系统上运行的工具。其原理为:将python代码(自己写的部分)转换成C代码,以提高运行的速度。
通用选项
- --standalone 使得打包结果与本地的Python环境无关,即使得打包结果具备可移植性。
- --onefile 使得打包结果为一个可执行文件,而不是一个文件夹。
小结:--onefile选项下打出来的包本身就具备可移植性,因此不需要额外加上 --standalone。--onefile 打包结果像绿色软件,仅一个可执行文件;--standalone的打包结果像经过安装的软件,文件夹下包含运行所需要的文件和程序入口。
- --lto用于启用链接时间优化。链接时间优化是一种编译器优化技术,它可以在编译和链接阶段对整个程序进行优化,而不仅仅是对单个源文件进行优化。通过启用lto,您可以让编译器在链接时对生成的目标代码进行更深入的优化,提高程序的性能和执行效率
- --remove-output 在打包结束后,清理打包过程中生成的临时文件。
- --enable-plugin= 启用插件,等号后跟插件名。在要打包的Python代码使用了一些特殊的包时,需要启用插件,Nuitka才能够正确打包。如:如在代码中使用了PySide6,就需要加上--enable-plugin=pyside6。具体的插件列表可以使用nuitka --plugin-list来查看。
- --disable-console 在运行打包后的程序时,不会弹出控制台,而是直接运行GUI程序。
- --include-package-data= 包含给定软件包名称中的数据文件,等号后软件包名称。有的时候Nuitka并不能正确分析出一些Python软件包所需要使用的数据文件,在运行程序时提示FileNotFoundError等错误,此时就需要使用该选项。如:--include-package-data=ultralytics
- --include-data-files= 按文件名包含数据文件,等号后的格式为。SRC指的是文件夹的路径,DEST指的是文件夹相对于打包结果的路径,其中DEST只能使用相对路径。如:--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt
- --include-data-dir= 包含文件夹中的数据文件,等号后的格式为。使用方法与--include-data-files=相同。
python安装nuitka模块
pip install -U nuitka
使用 Nuitka 将简单的 python3 代码编译为一个二进制文件
python -m nuitka --lto=no --onefile --standalone test1.py
使用 Nuitka 将简单的 python3 代码编译为带有numpy模块的C代码
python -m nuitka --lto=no --onefile --standalone --include-module=numpy test1.py
实用命令
python -m nuitka --help # 查看 Nuitka 帮助手册 python -m nuitka --plugin-list # 查看 Nuitka 插件列表
举例
python -m nuitka --standalone --remove-output {your_python_program_name}.py python -m nuitka --onefile --remove-output {your_python_program_name}.py python -m nuitka --standalone --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py python -m nuitka --macos-create-app-bundle --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py注意事项
1.官方文档中提到,相对于直接使用nuitka命令,python -m nuitka是更好的选择。
Avoid running the nuitka binary, doing python -m nuitka will make a 100% sure you are using what you think you are. Using the wrong Python will make it give you SyntaxError for good code or ImportError for installed modules. That is happening, when you run Nuitka with Python2 on Python3 code and vice versa. By explicitly calling the same Python interpreter binary, you avoid that issue entirely.
2.用于执行Nuitka的Python解释器最好是CPython,即Python解释器的标准实现。使用Apple Python等Python解释器部分功能将受限。
It has to be CPython, Anaconda Python.
You need the standard Python implementation, called “CPython”, to execute Nuitka, because it is closely tied to implementation details of it.
Nuitka优缺点
优点
- 对动态链接库的分析相对准确
- 打包生成的软件占用空间较小
缺点
- 打包时间相对较长
- 有商业版本,需要收费
命令
Options: --help 显示此帮助消息并退出 --version 显示错误报告的版本信息和重要详细信息,然后退出。默认为关闭。 --module 创建一个可执行的扩展模块,而不是一个程序。默认为关闭。 --standalone 为输出启用独立模式。这允许您在不使用现有Python安装的情况下将创建的二进制文件传输到其他机器。这也意味着它将变得更大。它暗示了以下选项:"--follow imports"和"--python flag=no_site"。默认为关闭。 --onefile 在独立模式之上,启用onefile模式。这意味着不是一个文件夹,而是一个压缩的可执行文件被创建和使用。默认为关闭。 --python-debug 是否使用调试版本。Default使用您正在使用的来运行Nuitka,很可能是非调试版本。 --python-flag=FLAG 要使用的Python标志。默认值是您用来运行Nuitka的内容,这会强制执行特定的模式。这些选项也存在于标准Python可执行文件中。当前支持:"-S"(别名"no_site")、"static_hashes"(不使用哈希随机化)、"no_warnings"(不给出Python运行时警告)、"-O"(别名为"no_assels")、"no_docstring"(不使用文档字符串)、"-u"(别名为"unbuffered")和"-m"。默认为空。 --python-for-scons=PATH 如果使用Python3.3或Python3.4,请提供用于Scons的Python二进制文件的路径。否则,Nuitka可以使用您运行Nuitka的软件,也可以使用Windows注册表中的Python安装。在Windows上,需要Python 3.5或更高版本。在非Windows上,Python 2.6或2.7也可以。
常用选项
--mingw64 #默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议) --standalone 独立环境,这是必须的(否则拷给别人无法使用) --windows-disable-console 没有CMD控制窗口 --output-dir=out 生成exe到out文件夹下面去 --show-progress 显示编译的进度,很直观 --show-memory 显示内存的占用 --enable-plugin=pyside6 打包pyside6模块的刚需 --plugin-enable=tk-inter 打包tkinter模块的刚需 --plugin-enable=numpy 打包numpy,pandas,matplotlib模块的刚需 --plugin-enable=torch 打包pytorch的刚需 --plugin-enable=tensorflow 打包tensorflow的刚需 --windows-icon-from-ico=你的.ico 软件的图标 --windows-company-name=Windows下软件公司信息 --windows-product-name=Windows下软件名称 --windows-file-version=Windows下软件的信息 --windows-product-version=Windows下软件的产品信息 --windows-file-description=Windows下软件的作用描述 --windows-uac-admin=Windows下用户可以使用管理员权限来安装 --linux-onefile-icon=Linux下的图标位置 --onefile 像pyinstaller打包成单个exe文件 --include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子 --include-module=复制比如when.py 这些以.py结尾的叫模块 –-include-package-data=包含给定软件包名称中的数据文件,等号后软件包名称。有的时候Nuitka并不能正确分析出一些Python软件包所需要使用的数据文件,在运行程序时提示FileNotFoundError等错误,此时就需要使用该选项。如:--include-package-data=ultralytics –-include-data-files= 按文件名包含数据文件,等号后的格式为。SRC指的是文件夹的路径,DEST指的是文件夹相对于打包结果的路径,其中DEST只能使用相对路径。如:--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt -–include-data-dir= 包含文件夹中的数据文件,等号后的格式为。使用方法与--include-data-files=相同。 --follow-import-to=MODULE/PACKAGE 如果使用该模块,请遵循该模块;如果是一个包,请遵循整个包。可以多次给定。默认为空。
控制结果中包含的模块和包
--include-package=PACKAGE 包括整个包裹。作为Python命名空间,例如"some_package.sub_package",然后Nuitka会找到它,并将它和在该磁盘位置下找到的所有模块包括在它创建的二进制或扩展模块中,并使其可供代码导入。为了避免不需要的子包,例如测试,您可以这样做"--nofollow import To=*.tests"。默认为空。 --include-module=MODULE 包括单个模块。将其作为Python命名空间,例如"some_package.some_module",然后Nuitka会找到它,并将其包含在它创建的二进制或扩展模块中,并使其可由代码导入。默认为空。 --include-plugin-directory=MODULE/PACKAGE 还包括在该目录中找到的代码,将它们视为一个主文件。覆盖所有其他包含选项。您应该更喜欢其他包含选项,这些选项以名称而不是文件名命名,这些选项通过在"sys.path"中查找内容。此选项仅适用于非常特殊的用例。可以多次给定。默认为空。 --include-plugin-files=PATTERN 包括在与图案匹配的文件中。覆盖所有其他跟随选项。可以多次给定。默认为空。 --prefer-source-code 对于已经编译的扩展模块,其中既有源文件又有扩展模块,通常使用扩展模块,但最好从可用的源代码编译模块以获得最佳性能。如果不需要,则有--no-preferred源代码来禁用有关它的警告。默认为关闭。
控制到导入的模块
--follow-imports 下降到所有导入的模块中。在独立模式下默认为打开,否则为关闭。 --follow-import-to=MODULE/PACKAGE 如果使用该模块,请遵循该模块;如果是一个包,请遵循整个包。可以多次给定。默认为空。 --nofollow-import-to=MODULE/PACKAGE 即使使用该模块名称,也不要跟随该模块名称;或者,如果包名称在任何情况下覆盖整个包,则覆盖所有其他选项。可以多次给定。默认为空。 --nofollow-imports 根本不要进入任何导入的模块,覆盖所有其他包含选项,并且不适用于独立模式。默认为关闭。 --follow-stdlib 还可以从标准库中导入模块。这将大大增加编译时间,而且目前还没有经过很好的测试,有时也无法工作。默认为关闭。
OneFile选项
--onefile-tempdir-spec=ONEFILE_TEMPDIR_SPEC 将其用作在一个文件模式下解压缩到的文件夹。默认为"%TEMP%/onefile_%PID%_%TIME%",即用户临时目录,并且是非静态的,它将被删除。例如,使用"%CACHE_DIR%%COMPANY%/%PRODUCT%/%VERSION%"这样的字符串,这是一个良好的静态缓存路径,因此不会删除。 --onefile-child-grace-time=GRACE_TIME_MS 当停止子项时,例如由于CTRL-C或关机等原因,Python代码会得到一个"KeyboardInterrupt",它可以处理该中断,例如刷新数据。这是以毫秒为单位的时间,在它以艰难的方式杀死孩子之前。单位为毫秒,默认为5000。
数据文件
--include-package-data=PACKAGE 当停止子项时,例如由于CTRL-C或关机等原因,Python代码会得到一个"KeyboardInterrupt",它可以处理该中断,例如刷新数据。这是以毫秒为单位的时间,在它以艰难的方式杀死孩子之前。单位为毫秒,默认为5000。 --include-data-files=DESC 在分发中按文件名包括数据文件。允许的形式有很多。使用"--include data files=/path/to/file/*.txt=folder_name/some.txt",它将复制单个文件,如果是多个文件,则会抱怨。使用"--include data files=/path/to/files/*.txt=folder_name/",它会将所有匹配的文件放入该文件夹。对于递归复制,有一个具有3个值的表单"--include data files=/path/to/scan=folder_name=**/*.txt",将保留目录结构。默认为空。 --include-data-dir=DIRECTORY 在分发中包括完整目录中的数据文件。这是递归的。如果您想要非递归包含,请使用模式检查"--include data files"。一个例子是整个目录的"--include data dir=/path/some_dir=data/some_dir"(用于纯拷贝)。所有文件都将被复制,如果要排除文件,则需要事先将其删除,或者使用"--noinclude data files"选项将其删除。默认为空。 --noinclude-data-files=PATTERN 不要包含与给定文件名模式匹配的数据文件。这是针对目标文件名,而不是源路径。因此,要忽略包数据中的文件模式,"package_name"应匹配为"package_name/*.txt"。或者,对于整个目录,只需使用"packagename"。默认为空。 --list-package-data=LIST_PACKAGE_DATA 输出为给定包名称找到的数据文件。未完成默认设置。
DLL文件
--noinclude-dlls=PATTERN 不包括与文件名模式匹配的DLL文件鉴于这是针对目标文件名,而不是源文件名路径。因此,忽略包含在软件包"package_name"应匹配为"软件包名称/someDLL.*"。默认为空。 --list-package-dlls=LIST_PACKAGE_DLLS 输出为给定程序包名称找到的DLL。未完成默认设置。
控制Nuitka发出的警告
--warn-implicit-exceptions 对编译时检测到的隐式异常启用警告。 --warn-unusual-code 对编译时检测到的异常代码启用警告。 --assume-yes-for-downloads 如果需要,允许Nuitka下载外部代码,例如依赖walker、ccache,甚至Windows上的gcc。要禁用,请重定向来自nul设备的输入,例如"
