抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

我看了看手上的牌,明白自己无牌可出

之前实习的时候遇到的需求,就总结下,主要使用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的binsite_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文件掏出来就可以直接双击运行了

评论