nuitka 打包 pyqt 应用为exe-实操

1 安装nuitka

pip install -U nuitka
.....
Successfully built nuitka
Installing collected packages: zstandard, ordered-set, nuitka
Successfully installed nuitka-2.3.4 ordered-set-4.1.0 zstandard-0.22.0

查看一下参数:

$ python -m nuitka -h
Usage: python.exe -m nuitka [--module] [--run] [options] main_module.py

--help:显示帮助信息并退出。
--version:显示版本信息和重要的错误报告细节,然后退出。
--module:创建一个可导入的二进制扩展模块可执行文件,而不是一个程序。
--standalone:启用独立模式。这允许你将创建的二进制文件转移到其他机器,而无需使用现有的Python安装。这也意味着它会变得很大。它暗示这些选项:"--follow-imports""--python-flag=no_site"--onefile:在独立模式的基础上,启用onefile模式。这意味着创建和使用的不是一个文件夹,而是一个压缩的可执行文件。
--python-flag=FLAG:要使用的Python标志。默认是你用来运行Nuitka的,这强制使用特定的模式。这些是标准Python可执行文件也存在的选项。目前支持:"-S"(别名 "no_site"),"static_hashes"(不使用哈希随机化),"no_warnings"(不给出Python运行时警告),"-O"(别名 "no_asserts"),"no_docstrings"(不使用doc字符串),"-u"(别名 "unbuffered"),"isolated"(不加载外部代码)和 "-m"(包模式,编译为 "package.main")。默认为空。
--python-debug:使用调试版本或不使用。默认使用你用来运行Nuitka的,最可能是一个非调试版本。只用于
调试和测试目的。
--python-for-scons=PATH:当使用Python 3.4编译时,提供一个用于Scons的Python二进制文件的路径。否则,Nuitka可以使用你用来运行Nuitka的,或者找到Python安装,例如从Windows注册表。在Windows上,需要Python 3.5或更高版本。在非Windows上,Python 2.62.7也可以。
--main=PATH:如果指定一次,这将取代位置参数,即要编译的文件名。当给出多次时,它启用"multidist"(参见用户手册),它允许你根据文件名或调用名创建二进制文件。

关于包含模块和包在结果中的控制:  
--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-prefer-source-code 来禁用关于它的警告。默认关闭。

关于跟踪到导入模块的控制:  
--follow-imports:进入所有导入的模块。在独立模式中默认为开启,否则为关闭。
--follow-import-to=MODULE/PACKAGE:如果使用,跟踪到该模块,或者如果是包,到整个包。可以多次给出。默认为空。
--nofollow-import-to=MODULE/PACKAGE:即使使用,也不跟踪到该模块名,或者如果是包名,到整个包,在任何情况下,都覆盖所有其他选项。这也可以包含模式,例如 "*.tests"。可以多次给出。默认为空。
--nofollow-imports:根本不进入任何导入的模块,覆盖所有其他包含选项,不能用于独立模式。默认为关闭。
--follow-stdlib:也进入从标准库导入的模块。这将大大增加编译时间,而且目前还没有经过充分测试,有时可能无法工作。默认为关闭。

关于onefile选项:  
--onefile-tempdir-spec=ONEFILE_TEMPDIR_SPEC:在onefile模式下,使用这个文件夹来解压。默认为 '{TEMP}/onefile_{PID}_{TIME}',即用户临时目录,由于非静态,它被删除。使用例如 '{CACHE_DIR}/{COMPANY}/{PRODUCT}/{VERSION}' 这样的字符串,这是一个好的静态缓存路径,这将不会被删除。
--onefile-child-grace-time=GRACE_TIME_MS:当停止子进程,例如由于CTRL-C或关机等,Python代码会得到一个 "KeyboardInterrupt",它可能会处理,例如刷新数据。这是在以硬方式杀死子进程之前的时间量。单位是毫秒,默认为5000--onefile-no-compression:在创建onefile时,禁用负载的压缩。这主要是为了调试目的,或者为了节省时间。默认为关闭。
--onefile-as-archive:在创建onefile时,使用一个可以用 "nuitka-onefile-unpack" 解压的存档格式,而不是只有onefile程序自己解压的流。默认为关闭。

关于数据文件:
--include-package-data=PACKAGE:包含给定包名的数据文件。DLL和扩展模块不是数据文件,永远不会像这样被包含。默认情况下,不包含包的数据文件,但包配置可以做到。这只会包含非DLL,非扩展模块,即实际的数据文件。在":"后面,可以选择性地给出一个文件名模式,只选择匹配的文件。  
--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'。或者对整个目录简单地使用'package_name'--include-onefile-external-data=PATTERN:在onefile二进制文件外部而不是内部包含指定的数据文件模式。只有在'--onefile'编译的情况下才有意义。首先,文件必须以某种方式指定为包含,然后这个参数指的是目标路径。  
--list-package-data=LIST_PACKAGE_DATA:输出给定包名的数据文件。  
--include-raw-dir=DIRECTORY:在分发中完全包含原始目录。这是递归的。检查'--include-data-dir'以使用合理的选项。


win 控制参数:
--windows-icon-from-ico=ICON_PATH:添加可执行文件图标。可以多次给出不同的分辨率,或者包含多个图标的文件。在后一种情况下,你也可以用#<n>后缀,其中n是从1开始的整数索引,指定要包含的特定图标,忽略所有其他图标。</n>  
--windows-icon-from-exe=ICON_EXE_PATH:从这个现有的可执行文件复制可执行图标(仅限Windows)。  
--onefile-windows-splash-screen-image=SPLASH_SCREEN_IMAGE:当为Windows和onefile编译时,加载应用程序时显示此项。默认关闭。  
--windows-uac-admin:请求Windows用户控制,以在执行时授予管理员权限。(仅限Windows)。默认关闭。  
--windows-uac-uiaccess:请求Windows用户控制,以强制只从少数几个文件夹运行,远程桌面访问。(仅限Windows)。默认关闭。

控制输出参数:
--output-filename=FILENAME:指定可执行文件的名称。对于扩展模块,没有选择,对于独立模式也是如此,使用它将是一个错误。这可能包含需要存在的路径信息。在此平台上,默认为'<program_name>.exe'--output-dir=DIRECTORY:指定应将中间和最终输出文件放在何处。DIRECTORY将填充构建文件夹,dist文件夹,二进制文件等。默认为当前目录。  
--remove-output:在生成模块或exe文件后删除构建目录。默认关闭。  
--no-pyi-file:不为Nuitka创建的扩展模块创建'.pyi'文件。这用于检测隐式导入。默认关闭。

上述参数只是列出了部分参数, 并不是全部参数。

2 实操打包

第一次执行执行这个命令:


python -m nuitka --standalone --remove-output  chess_validate_main.py  

会有告警, 并且会出现让下载 MinGW64 的提示, 先执行完, 然后修正,命令再次执行。

$ python -m nuitka --standalone --remove-output  chess_validate_main.py          
Nuitka-Options: Used command line options: --standalone --remove-output chess_validate_main.py
Nuitka: Starting Python compilation with Nuitka '2.3.4' on Python '3.10' commercial grade 'not installed'.
Nuitka-Plugins:WARNING: Use '--enable-plugin=pyqt5' for: Inclusion of Qt plugins.
Nuitka: Completed Python level compilation and optimization.                       
Nuitka: Generating source code for C backend compiler.
Nuitka: Running data composer tool for optimal constant value handling.              
Nuitka: Running C compilation via Scons.
Nuitka will use gcc from MinGW64 of winlibs to compile on Windows.

Is it OK to download and put it in 'C:\Users\xxx\AppData\Local\Nuitka\Nuitka\Cache\downloads\gcc\x86_64\13.2.0-16.0.6-11.0.1-msvcrt-r1'.

Fully automatic, cached. Proceed and download? [Yes]/No :
Nuitka: Downloading 'https://github.com/brechtsanders/winlibs_mingw/releases/download/13.2.0-16.0.6-11.0.1-msvcrt-r1/winlibs-x86_64-posix-seh-gcc-13.2.0-llvm-16.0.6-mingw-w64msvcrt-11.0.1-r1.zip'.
Download mingw64 19.4%|████▊                    | 58867712/303701536

这还只是一个尝试命令, 还没有包含我的数据文件和图片文件, 不过执行过程确实慢, 慢, 慢!

由于上面遇到告警, 纠正就, 再次执行:


python -m nuitka --standalone --remove-output  --enable-plugin=pyqt5 chess_validate_main.py  

这个时候会收到下面的告警:

Nuitka-Plugins:WARNING: pyqt5: For the obsolete PyQt5 the Nuitka support is incomplete. Threading, callbacks to compiled functions, etc. may not be working.
Nuitka-Plugins:WARNING:     Complex topic! More information can be found at https://nuitka.net/info/pyqt5.html

暂时先不管, 让程序执行完后, 我手动复制我的资源文件和图片文件到 chess_validate_main.exe 所在的目录, 测试的时候除了弹出console外, 没发现其他的问题

前面需要手动复制资源文件, 这次直接补全参数。最终完整的命令为:

$ python -m nuitka --standalone --remove-output --windows-console-mode=disable --enable-plugin=pyqt5 --include-data-dir=D:/python_project_2/chess_validate_tool/Images=Images  --include-data-files=D:/python_
project_2/chess_validate_tool/engine_data/*.exe=engine_data/ chess_validate_main.py  

3 问题

  • 数据文件以 exe 为后缀时, 使用–include-data-dir 无法复制数据
    engine_data文件夹内的数据文件是以exe为后缀, 当我使用–include-data-dir的时候, 提示下面的警告
 python -m nuitka --standalone --remove-output --windows-console-mode=disable --enable-plugin=pyqt5 --include-data-dir=D:/python_project_2/chess_validate_tool/Images=Images  --include-data-dir=D:/python_pr


Nuitka-Options:WARNING: No data files in directory 'D:/python_project_2/chess_validate_tool/engine_data.'

提示找不到数据文件, 于是更换为

--include-data-files=D:/python_project_2/chess_validate_tool/engine_data/*.exe=engine_data/

后问题解决。

4 总结

在另一个日记https://blog.csdn.net/zhanghuaren2003/article/details/139743462 中 尝试了 pyinstaller, cxfreeze , 以及这次的nuitka, 就我自己的感受而言, 针对我自己的这个例子,cxfreeze 是最简单的, 其次是 pyinstaller 再次是 nuitka, 不过当使用过一次后, 再次使用时间成本都差不多

执行效率上, 奈何我的例子不适合做对比, 我感觉都差不多, 但是理论上 nuitka , 将代码编译为c, 速度快, 这个具体情况具体分析吧

文件大小上, 每一种工具都是浅尝辄止,cxfreeze和 nuitka打出的包半斤八两, pyinstaller的最小

文件结构上, 我喜欢pyinstaller打出的结果, 一个exe, 外加一个完成的文件夹包含所有的依赖(数据文件+各种依赖包), 比较整洁。

最后还是那句话, 适合自己的就是最好的。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值