之前实习的时候遇到的需求,就总结下,主要使用Nuitka库
前言
也许是因为对于大部分python程序来说,运行只需要两句
pip install -r requirements.txt
python *.py
所以网上对于打包python的教学并不是很多,所以这里也稍微总结下踩过的坑
Why Nuitka
真正的打包编译成C,有着非常好的压缩率,同时对于跨平台的支持也相对友好,在网上的教程与讨论也相对较多,打包跟着打印信息比较容易定位问题
大坑(非常重要)
官方文档Qt for Python & Nuitka - Qt for Python中说明了目前PyQt与macOS的当前版本无法打包运行,可以降级macOs到2020年前的版本或替换PyQt为PySide来解决问题
不要使用conda或者虚拟环境,下载一个python并配置环境变量即可(macOs可以用系统自带的)
Nuitka的简单暴力使用
我知道拿到这个需求大概就是想知道一句能把软件打包出来,所以我尽量一切从简
不过其实要一句打包完还是不太可能的,大体来说需要一些步骤,不过做这个最重要的是耐心,毕竟等待编译的过程实际上颇为煎熬
开头
以下命令可以将python项目进行第一次打包
python -m nuitka --standalone --show-progress --show-memory --enable-plugin=pyqt6 --nofollow-import-to=jpype,http,email,xml,urllib --output-dir=o main.py
参数简单说明:
-
--standalone
可分发到其他机器上 -
--show-progress --show-memory
调试信息 -
--enable-plugin=pyqt6
使用的插件,如果使用pyside6更换为pyside6即可,具体有哪些插件可以使用python -m nuitka --plugin-list
进行查看 -
--nofollow-import-to=jpype,http,email,xml,urllib
不打包的库,这里主要是一些花费时间很长但不一定使用的包,如果使用的话,在python的bin
或site_packages
文件夹下把对应的包拖到可执行文件的所在目录即可,如果在观察日志时发现有些包打包时间特别长也可以加入进来,在后面的步骤根据需要打包进去 -
--outdir=o
输出到名o的文件夹 -
main.py
入口的python文件
调整至可执行
上述的命令一般能够打包出一个可执行文件,在o\*.dist
文件夹中,使用命令行运行可执行文件
cd workspace\o\*.dist
.\*.exe
这样会打印信息看到缺少的python库或相关文件,一般缺少的库是nofollow-import-to
里面的,将缺少的库文件夹或相关文件复制粘贴进可执行文件的所在目录,再次尝试直到可以运行
这个时候其实已经打包出了能够运行的可执行文件了,如果说不希望手拖这些库文件,就将对应的库从nofollow-import-to
选项里取消就能够自动打包进去了(只是增加耗时)
onefile
这个指令很简单,在上面的方案中可执行文件的文件夹下会附带一大堆编译出来的库,非常的不美观,使用选项--onefile
可以把这些打包成一个文件
根据网上的说法,有的时候会出现onefile无法运行的情况,如果上面打包的方式可以运行了,而onefile不行不要强求
跟打包进*.dist
文件夹相同,只需添加选项即可
python -m nuitka --standalone --show-progress --show-memory --enable-plugin=pyqt6 --nofollow-import-to=jpype,http,email,xml,urllib --output-dir=o --onefile gui_main.py
接着复制粘贴文件或库进可执行文件所在的文件夹中即可
macOs
注意上面的那个大坑
macOs一开始打包出来的是*.bin
,使用的命令也是跟Windows的一样,必须通过命令行来运行
cd workspace\o\*.dist
.\*.bin
然后调整至确认文件可以运行,再使用选项--macos-create-app-bundle
将项目打包为可执行的app,然后再操作一遍即可,实际上能运行的是包内容里面的unix可执行文件,app还是没搞定怎么直接用,把里面的unix文件掏出来就可以直接双击运行了