Linux
Python打包,Nuitka,高效
Python打包exe等高效工具Nuitka
前言
Python常用的打包工具有 Nuitka、Pyinstaller、py2exe、Cx_freeze,最火的莫过于Pyinstaller和Nuitka。比较之下,Nuitka更好,速度更快。因为:
nuitka的作用是将python程序转换成C语言的可执行elf文件。这样在运行时就可以享受到C语言处理过程中的优化,提高速度。经测试,Nuitka打包后的exe比Pyinstaller打包后的exe运行速度提升30%。
1. 安装
Nuitka的安装直接一条命令即可
pip install nuitka
但为了使环境依赖简洁,最好创建虚拟环境
conda create -n EXE python=3.7
conda activate EXE
pip install nuitka
输入
nuitka3 --version
或
python -m nuitka --version
可以查看其版本号,笔者nuitka安装的是1.2版本,所用的环境是Ubuntu 20.04,Python3.7
2. 准备代码
例如:main.py
def say(info):
return "Say " + info
def main():
print(say("Hello World"))
if __name__ == "__main__":
main()
或者其他大的工程项目。
3. 打包
为了避免打包时依赖定位错误,建议使用 python -m nuitka ...
,不要直接用 nuitka
命令。
打包常用参数:
--standalone
: --standalone 独立环境,这是必须的(否则拷给别人无法使用)。--onefile
: 打包成一个可执行二进制文件。有这个参数时可以省略上面的 --standalone 参数。--remove-output
:删除临时缓存。-o
:输出,打包成的文件名。
1)Linux
(1)简单打包(适合没有过多依赖的,如一个py脚本)
# 1. 打包成文件夹
python -m nuitka --standalone --remove-output main.py
# 2. 打包成单文件,默认生成二进制文件main.bin
nuitka3 --standalone --remove-output --onefile main.py # --onefile 参数: 生成一个打包文件
nuitka3 --standalone --remove-output --onefile -o main main.py # -o 指定输出
执行测试:
# 执行打包生成的二进制文件
./main.bin
./main
(2)专业打包(适合工程项目)
python -m nuitka --onefile --remove-output --static-libpython=no --include-module=main -o main main.py
2)Win
# 打包成文件夹
nuitka --standalone --remove-output --mingw64 main.py
# 打包成单文件
nuitka3 --standalone --remove-output --mingw64 --onefile main.py
另外,安装 zstandard
(一个类似zip、rar的压缩文件的包)后再打包可以让打包出来的文件更小:
pip install zstandard
安装后,上面打包命令不变!
3)打包常见报错解决
由于是新建的python虚拟环境,打包时候可能会出现缺失依赖包等的报错和警告。
(1)报错
Nuitka-Options:INFO: Used command line options: --standalone --remove-output --onefile main.py
则直接
pip install patchelf
或者通过系统安装,比如:如果是Ubuntu,也可直接
apt install patchelf
# 卸载
# apt remove patchelf
即可!
(2)报警告
Nuitka:WARNING: Using very slow fallback for ordered sets, please install 'orderedset' PyPI package for best Python
Nuitka:WARNING: compile time performance.
则直接
pip install orderedset
即可!
4)其他打包参数
win:
--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文件
--include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子
--include-module=复制比如when.py 这些以.py结尾的叫模块
4. 应用
1)pyqt5
打包pyqt5 GUI应用
python -m nuitka --standalone --onefile --remove-output --enable-plugin=pyqt5 --include-module=PyQt5 ./你的文件名.py
注: 使用 python -m nuitka
命令打包100%安全,比直接用编译后的二进制命令 nuitka
打包更好!!!