Pyinstaller打包PyQt5的一些坑(库缺失、移植出错)

3 篇文章 0 订阅
1 篇文章 0 订阅

Pyinstaller打包PyQt5的一些坑 终极打包方案(缺失库、移植出错)

背景

最近女朋友有个需要批量处理word的工作,为了方便,我用Python3+PyQt5写了个批量处理的程序,写完打包好后,运行程序出现了各种各样的错误。这里要感谢一位好心前辈给链接,给了我解决问题的思路。

这里放上链接https://zhuanlan.zhihu.com/p/26527374.

不建议用pyinstaller的命令打包,本文是用pyinstaller和.spec格式文件打包,spec文件,是每次用命令打包时都会自动生成的一个打包配置文件,我们需要修改里面的信息后再打包。

具体问题和解决方案

在我这个案例当中,我大体上遇到两个问题,一个是PyQt5的某些文件或库缺失,另一个是移植到别的电脑上时出现缺失api-ms-win-crt-xxxx-xx-x-x.dll的问题

在第一次打包的时候,出现了找不到Qt5Widgets.dll等Qt5xxx.dll库的警告,生成的exe文件也运行不了,经过百度寻找解决方法,有说法是要把目录Python3.5.3\Lib\site-packages\PyQt5\Qt\binPython3.5.3\Lib\site-packages\PyQt5\Qt\plugins添加到PATH环境变量,但我添加了环境变量后仍然出现这个警告。
打包时出现的错误
在看了前辈给的链接后,我有了解决思路。我用sublime text打开pyinstaller打包时生成的spec格式文件
在这里插入图片描述
打开后的内容如下,注意观察保存了路径的列表pathex。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['DocumentIntegrator.py'],
             pathex=['D:\\Python Files\\PyCharm_Project\\DocumentArrangement'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='DocumentIntegrator',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='Resources\\Icon.ico')

然后把PyQt5相关的几个目录添加进去pathex列表中,为了保险起见,我把3个目录都粘贴上去,注意这里的目录分隔符一定要用\\,如下:

pathex=['D:\\Python Files\\PyCharm_Project\\DocumentArrangement',
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5',
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\bin',
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\plugins'],

然后把pyinstaller打包时生成的dist和build文件夹删掉,只留下.spec格式的文件。打开命令行,进入到当前要打包的目录下,输入命令:pyinstaller -F 文件名.spec,我这里是:

pyinstaller -F DocumentIntegrator.spec

再次打包,没有上述警告了,但是运行程序时出现了以下错误提示
提示需要
于是我再次百度,找到了解决方法。
打开目录Python3.5.3\Lib\site-packages\PyQt5\Qt\plugins,把该目录下的platforms文件夹复制到生成的程序所在的目录下,比如我这里是:
复制platforms文件夹到程序所在的目录
(PS:按道理说,把路径Python3.5.3\Lib\site-packages\PyQt5\Qt\plugins\platforms添加到pathex中应该也可以的,但经检验不可行…)

到这里该问题就解决了,程序在本机上能运行,但当我把程序发给女友的时候,在她的电脑上却运行出错,她的系统是Win8.1(没错就是这么落后,我会找机会帮她重装系统的…)

出现的错误提示截图如下:
当把程序移植到别的系统时(如Win8.1),运行则出现图中的错误提示
有了前面的思路,我的想法是,能不能把api-ms-win-crt-xxx-xx-x-x.dll等一类的库文件也添加到.spec文件里的pathex列表中呢?事实证明这种方法是可行的。

于是我打开了这些库文件所在的目录,我用的Win10,路径是 C:\Windows\System32\downlevel,其他系统建议搜索一下定位到相应目录。

为了保险起见,我把该路径也添加到环境变量中,同时也添加到pathex列表中:

pathex=['D:\\Python Files\\PyCharm_Project\\DocumentArrangement',
'C:\\Windows\\System32\\downlevel', 
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5',
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\bin',
'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\plugins'],

再打包,发给女友,诶程序能运行了,开心O(∩_∩)O
程序能运行啦
完整的.spec文件内容如下,噢对咯,别忘了设置图标,在下面的icon变量里:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['DocumentIntegrator.py'],
             pathex=['D:\\Python Files\\PyCharm_Project\\DocumentArrangement',
             'C:\\Windows\\System32\\downlevel',
             'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5',
             'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\bin',
             'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\plugins\\platforms',
             'C:\\Softwares\\Programs\\Python3.5.3\\Lib\\site-packages\\PyQt5\\Qt\\plugins'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='DocumentIntegrator',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='Resources\\Icon.ico')
  • 33
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
PyInstaller是一个用于打包Python文件的,可以将Python脚本转换成可执行文件。对于使用PyQt5编写的脚本进行打包,首先需要确保已经安装了PyInstallerPyQt5。然后,可以按照以下步骤进行打包: 1. 打开终端或命令提示符窗口,并切换到包含主函数文件的目录。 2. 运行以下命令:`pyinstaller your_script.py`,其中"your_script.py"是你要打包的脚本的文件名。 3. PyInstaller将开始分析脚本并创建.spec文件,该文件将包含有关打包过程的配置信息。 4. 在.spec文件中,你可以对打包过程进行更多的自定义配置。可以使用文本编辑器打开.spec文件并进行修改。 5. 对于PyQt5脚本,通常需要添加额外的参数来解决特定的问题。例如,如果脚本中使用了Qt的平台插件(例如QtWebEngine),可能需要使用`--add-data`参数来包含这些插件。具体的参数配置可以参考PyInstaller的文档。 6. 修改完.spec文件后,运行以下命令:`pyinstaller your_script.spec`,其中"your_script.spec"是你修改后的.spec文件的文件名。 7. PyInstaller将开始根据.spec文件进行打包。在打包完成后,你将在当前目录中看到一个名为"dist"的文件夹,里面包含了打包后的可执行文件。 需要注意的是,PyInstaller打包过程可能因为项目的复杂性而有所不同。建议在打包前仔细阅读PyInstaller的文档,并根据你的具体需求进行适当的配置和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [pyinstaller打包pyqt5项目总结](https://blog.csdn.net/Sheleon1995/article/details/125041861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [pyinstaller打包pyqt5程序 全过程 超详细](https://blog.csdn.net/okfu_DL/article/details/84566545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-瑾-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值