如何打包软件?
需求:
1.基于pyqt5开发的软件;
2.打包时需要将项目文件夹中的main.py、path.py、ui.py、QSS子文件夹、win子文件夹一并打包;
完整的打包流程如下:
准备工作
-
安装PyInstaller: 确保您的conda环境已经安装了PyInstaller。如果尚未安装,可以通过运行以下命令来安装:
conda install -c conda-forge pyinstaller
-
切换到相应的conda环境: 在开始打包之前,确保您已经切换到了包含您项目所有依赖的conda环境中。通过以下命令切换:
conda activate your_env_name
打包过程
-
准备打包文件: 确保
main.py
、path.py
、ui.py
以及QSS
和win
子文件夹位于项目的根目录下。如果有特定的资源文件或配置文件也需要包含在打包文件中,请确保它们也位于正确的位置。 -
编写打包脚本: 由于您需要包含特定的子文件夹和文件,建议在项目根目录下创建一个打包脚本
pack.py
。这个脚本将使用PyInstaller的API来定义打包的细节。以下是一个基本示例:from PyInstaller.__main__ import run if __name__ == '__main__': opts = [ 'main.py', '--onefile', # 打包成一个exe '--windowed', # GUI应用,不显示控制台 '--add-data=path.py;.', # 添加单独的python文件 '--add-data=QSS;QSS', # 添加QSS子文件夹 '--name=YourAppName', # 指定生成的可执行文件的名称 '--icon=icon.ico' # 如果有图标的话 ] run(opts)
请根据您的项目实际情况调整
--add-data
的路径和其他选项。 -
运行打包脚本: 打开终端或命令提示符,切换到包含
pack.py
的目录,运行以下命令:python pack.py
注意事项和常见问题
缺失库或文件:
打包后的应用程序可能因为缺少依赖而无法运行。请检查终端中的打包日志,寻找可能缺失的库或文件,并使用--add-data
选项将它们包含进去。
系统兼容性:
如果您计划将打包的应用程序在不同的操作系统上运行,请在目标操作系统上执行打包过程,以确保兼容性。
打包大小:
打包的应用程序可能会很大,因为它包含了所有的依赖库。使用--onefile
选项可以减小打包体积,但启动速度可能会稍慢。
安全软件误报:
打包的应用程序有时会被安全软件误报为恶意软件。确保从您的应用程序中排除任何恶意代码,并可能需要通知您的用户将应用程序列为安全软件的白名单。
怎么使用.spec文件进行打包
在使用PyInstaller打包Python应用程序时,它会自动生成一个.spec
文件。这个文件是打包过程中的一个关键组成部分,它描述了如何将您的Python程序转换成可执行文件的详细配置。如果想要修改打包配置,可以直接编辑这个.spec
文件,然后再次使用PyInstaller进行打包,这次直接引用.spec
文件而不是源代码文件。例如:
pyinstaller app.spec
这种方式允许更细致的控制打包过程,特别是对于复杂的应用程序,确保打包结果符合预期。
WARNING:file already exists but should not:_C.cp37-win_amd64:
解决:报错内容可能不同,但都是xxx已存在,问题的原因是pyinstaller打包时多打了一次,所以会报已经存在了。
这个解决方案就是把多余的去掉。
在自动生成的xxx.spec中,在 a 和 PYZ 中间添加如下代码,去掉多余依赖项
for d in a.datas:
if '_C.cp37-win_amd64' in d[0]:
a.datas.remove(d)
break
参考
Pyinstaller --onefile warning file already exists but should not
pyinstaller系列之七:打包各种问题汇总