Python打包工具Nuitka教程

发布时间:Aug. 22, 2023, 1:48 a.m.编辑:李佳生阅读(2157)

用python写代码非常爽,但是有时需要将自己写的程序分享给别人用,需要独立运行,由于很多原因又不能被反编译,这时候就不那么爽了。之前最常用的打包工具是pyinstaller,打包后的包体很大,打开很慢,且容易反编译。这是因为pyinstaller基本原理是将解释器和所有必要的库直接打包进可执行文件,因此可以在没有Python环境的计算机上运行,但效率也很低。

后来出现的开源、跨平台打包工具Nuitka可以一定程度解决上述问题,逐渐成为了pyinstaller的接班人。它将必要的Python源代码转换为C++并使用GCC,Clang或MSVC来编译这些代码,生成一个可执行文件或一个扩展模块。因此可以减小打包后的体积,提高运行速度,转为C++编译也基本避免了反编译的可能。但Nuitka使用方法相对于pyinstaller更复杂,需要配置的环境也更为复杂、中间过程的问题可能更多,不过入门之后,Nuitka是一款更好用、强悍的打包工具

环境配置

1、Python 3.8~

2、C++编译器:推荐稳定的MinGW 8.1,下载地址MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net,安装后将bin文件夹加入系统环境变量中即可。在cmd输入gcc --version来检查是否生效。

捕获.jpg

3、pip install nuitka

4、pip install 程序所有依赖

打包方法

官网:Nuitka the Python Compiler — Nuitka the Python Compiler documentation


打包指令示例:
python -m nuitka --mingw64 --standalone --show-progress --show-memory 
--plugin-enable=qt-plugins --plugin-enable=pylint-warnings 
--nofollow-import-to=numpy,matplotlib,scipy,pandas
--output-dir=D:\out main.py

常用参数含义说明:
--mingw64 默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
--standalone 独立环境,这是必须的(否则拷给别人无法使用)
--windows-disable-console 没有CMD控制窗口
--output-dir=out 生成exe到out文件夹下面去
--show-progress 显示编译的进度,很直观
--show-memory 显示内存的占用
--include-qt-plugins=sensible,styles 打包后PyQt的样式就不会变了
--plugin-enable=qt-plugins 需要加载的PyQt插件
--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文件,慎用,问题很多
--remove-output 删除编译临时文件
--include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子
--include-module=复制比如when.py 这些以.py结尾的叫模块

发现一款基于Nuitka的可视化打包工具EasyNuitka,还没验证实际效果,可以试试:

捕获.jpg

踩坑避雷

1、打包好的软件被杀毒软件当成病毒查杀

解决方法:第一种方法是直接将文件加入可信名单,但是有些杀毒软件交互不太好,可能需要反复设置;第二种方法是从根因解决,频繁调用win32com、win32api、os等系统接口容易被判定为病毒,因此非必要尽量不要使用系统接口来进行交互,可使用第三方库来代替,比如路径判断使用pathlib中的接口代替os.path等等

2、对Numba和Pyqt5支持不完全,特别是线程和回调:目前没发现什么好的解决办法,强行打包numba容易造成打包好的软件执行时崩溃;Pyqt5暂时没发现运行异常。

3、C++编译器版本要求warning

解决方法:可在Nuitka执行脚本删除版本检查,但是最新版已经不会拦截编译器版本,只会warning,可以不管。

4、打包软件路径变化

解决方法:使用os.path.dirname(os.path.dirname(os.path.abspath(__file__)))、os.chdir()指令修正一下

5、找不到dll:有些依赖(比如soundfile)本身会调用一些dll文件,但是打包时不会copy进程序文件夹,导致运行崩溃

解决方法:打包调试时,保留console窗口,将缺少的文件复制到exe目录下即可

6、路径中不要有中文!!!

关键字Coding 教程

上一篇:风噪【TODO】

下一篇:Warped Filter