为什么选择Nuitka?
Nuitka将Python代码编译为C,单凭这一点无论是效率、防反编译都是好的选择。但也不是十全十美,我在实战中有遇到如兼容性不太好、打包速度慢、文件臃肿等问题
记录打包过程
0、Python程序包含以下包:
- opencv-python:4.10.0.84
- numpy:1.24.3
- torch:2.3.1
- onnxruntime-gpu:1.18.1
- pandas:2.2.2
- time
- win32con
- win32gui
- configparser
其他环境:Nuitka版本2.4.7、CUDA版本12.0
1、cmd进入anaconda环境
我将Nuitka直接装在了推理环境中,所以得进入anaconda环境并切换目录到待打包的py文件目录下:
进入anaconda环境:
conda activate onnx
切换目录至待打包.py目录:
cd C:\hall\CarCV
2、 解释一下可能用到的参数
- --mingw64:(我的电脑是64位)使用MinGW-w64编译器来编译生成的C代码。自己装有并设置了环境变量可以,或第一次运行Nuitka帮你安装
- --standalone:main脚本生成exe,将所有依赖项(Python解释器、标准库、第三方库等)打包到一个独立的目录中
- --onefile:在
--standalone
的基础上,将所有东西汇聚到一个exe上。小项目可以,大项目十分不建议(后面提到) - --remove-output:Nuitka打包后会生成
build、dist目录,此参数会在打包后删除build临时目录,留下保存exe和环境的dist目录(加了
--onefile的话那就全删,只留一个exe)
- --follow-import-to=<module_name>:编译指定的模块或包,你知道项目中某个模块需要编译,但不想编译所有的外部依赖,可以使用这个参数
- --nofollow-imports:只编译main脚本,而导入的模块由Python解释器在运行时按需加载
- --show-progress:显示打包进度
3、建议
- 稍大的项目不建议加--onefile,因为编译出来exe动辄好几Gb,一运行就显示<此应用无法在你的电脑上运行>十分尴尬
- --follow-import-to和--nofollow-imports可以配合使用,--follow-import-to填入你自己写的.py脚本。我自己测试不加这俩在i5 12代、32GB内存下打包花了一个多小时,加了之后半个多小时。
4、开始打包,你可以选择以下命令之一
最朴素的:
nuitka --mingw64 --standalone --remove-output --show-progress onnx.py
带点自定义的:
nuitka --mingw64 --standalone --follow-import-to=<填模块名> --nofollow-imports --remove-output --show-progress onnx.py
5、拷贝模型到指定目录,进入dist目录并运行
将你的onnx模型拷贝到你python里写的地方。需要注意:你python运行在哪个anaconda环境,就要从哪个环境cd进去,并且运行exe
切换目录
cd onnx.dist
运行exe文件
onnx
6、如果没有报错,忽略以下
出现报错如果你本身python运行没问题,基本就是缺少xxx模块,举个栗子:
提示缺少fastrlock.rlock,那就到你安装的Anaconda目录->运行环境->包目录(参考我的C:\ProgramData\anaconda3\envs\onnx\Lib\site-packages)下找到这个包复制,然后粘贴到dist目录(onnx.exe在的onnx.dist目录)。以此反复直到可以运行