Python文件打包的两种方法

##背景:最近用Pyqt5编写界面后考虑到一些用户没有程序的运行环境,故而需要打包为exe程序提供给用户使用,在经过一番资料的查询以及踩坑后,写下了这篇博客,目前主要有两种主流的方法。分别是使用Pyinstaller与Nuitka进行打包。下面分享一下两种方法的具体使用与心得。(主要是Nuitka)

方法一:使用Pyinstaller进行打包

使用Pyinstaller打包,首先命令是非常简单的,但相应的是对于报错信息也不是很清楚(可能是本人太菜了,大佬可以忽略),同时打包时间也相对来说比较长。由于编写的程序涉及了比较多的文件以及引用了多个模块(如torch,numpy,cv2等),在报错信息看不懂的情况下加之网上的解决办法也鱼龙混杂(解决不了),故而寻找其他的打包办法,最后看到一些人推荐的Nuitka,抱着试一试的心态尝试使用了一下,发现确实好用,下面我详细介绍一下如何使用。

方法二:使用Nuitka进行打包

首先需要安装Nuitka打包的环境:
1、安装MinGW64
可以通过gcc.exe --version查看是否安装成功以及安装的版本(记得查看是在MinGW\bin的目录下),记得安装成功后加入到系统的环境变量中。
2、安装Nuitka
直接使用pip命令pip install nuitka
3、编译文件
首先需要在需要打包的文件目录下进行,命令如下:nuitka --mingw64 --standalone --windows-disable-console --show-progress --show-memory –
enable-plugin=pyqt5 --nofollow-import-to=torchvision,torch,cv2,numpy,matplotlib,PIL
–output-dir=out
–windows-icon-from-ico=./logo.ico main.py
下面详细介绍一下参数:
–mingw64:指定编译器;
–standalone:指定独立环境,这是程序能够给别人使用必须指定的
–windows-disable-console :设置不要控制台窗口
–show-progress: 显示编译的进度,即编译过程中下面的XX/XX。
–show-memory:显示内存的占用
–enable-plugin=pyqt5:因为使用了Pyqt5,所以在这里指定
–nofollow-import-to=torchvision,torch,cv2,numpy,matplotlib,PIL :这是重点,这是指定哪些模块不需要编译,这些模块是python系统的,可以让打包好的exe文件夹内的python3x.dll来执行,同时也省去了这些模块版本变化遇到的问题,如何知道哪些模块是系统的(可以在执行打包命令的时候观察最下面的进度)
–output-dir=out :指定输出文件夹
-windows-icon-from-ico=./logo.ico :指定程序图标
main.py 自己编写的执行程序
在打包完成后,不是有部分Python系统的模块没有打包吗,这时候只需要在Python文件夹里找到复制过来就行了,最后就能运行得到的exe文件了。