PyQt5

PyQt5实现文件传输程序(八):程序打包与发布

一、pyinstaller介绍

pyinstaller是一个十分有用的第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。

二、pyinstaller的使用

pyinstaller 需要在命令行(控制台)下用 pip 工具安装,如下:pip install pyinstaller。因为要打包pyqt的GUI程序,所以建议在32位python的环境下进行打包,因为64位python打包出来的pyqt并不兼容32位的机器。
使用 pyinstaller 库十分简单, 请注意,由于 pyinstaller 不支持源文件命中有英文句号(.)存 在,假设 dpython(文件名).py 文件在 D:\codes 目录中,命令如下:pyinstaller dpython.py
执行完毕后,源文件所在目录将生成 dist 和 build 两个文件夹。 其中,build 目录是 pyinstaller 存储临时文件的目录,可以安全删 除。最终的打包程序在 dist 内部的 dpython 目录中。目录中其他文件 是可执行文件 dpython.exe 的动态链接库。
在 pyinstaller 的命令当中还有一些常用的参数:
1. -F, --onefile 打包成一个exe文件(这两个参数能不用就尽量不用,打包一时爽,打开花5秒)。虽然这样说,但若 -D 出现难以解决的错误,可以尝试这个命令,之后使用ProcessExplorer添加所需的dll文件即可。
2. -D, --onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。
3. -c, --console, --nowindowed 使用控制台,无界面(默认)
4. -w, --windowed, --noconsole 使用窗口,无控制台
5. -i 可以设置图标路径,将图标放在根目录
6. --paths 指定一些需要的文件的路径,如果在打包过程中出现文件找不到的情况,可以尝试使用这个参数指定文件路径
7. --clean 清理掉临时文件

注意上述命令‘-’的数量,根据我的测试,除了单字母的命令可以用一个‘-’外,其他的命令需要使用两个‘-’,否则不起作用。
根据上述方法,我打包源程序的过程便是在cmd中切换到源程序所在目录,使用如下命令:
pyinstaller -w -D --paths=D:\Anaconda\Lib\site-packages\PyQt5\Qt\bin --paths=D:\Anaconda\Lib\site-packages\PyQt5\Qt\plugins --hidden-import=queue -i client.ico --clean mform.py

三、打包中出现的其他问题

  • 打包之后的程序在其他电脑上执行时经常出现无法找到dll文件的情况,这些问题只需要将相应的dll复制到程序所在的文件就可以了。
  • 另外我打包的程序在win xp系统上运行时,出现了“无法定位程序输入点getfinalpathnamebyhandlew于动态链接库kernel32 dll”的错误,检查之后才发现python3.6不支持win xp系统,可怜的xp系统,竟然也被python抛弃了。
  • 运行程序时出现"failed to execute script main"的错误,在打包命令里加上 --hidden-import=queue

四、在Github上发布程序

在GitHub上发布程序非常简单,只需要点击repository中的release选项,填上tag并将要发布的程序上传即可。