zoukankan      html  css  js  c++  java
  • Pyinstaller 打包exe 报错 "failed to execute script XXX"的一种解决方案

    最近用PyQt5写了一个界面小程序,需要打包成exe给到其他windows上使用,一开始使用python 3.7 64位,用pyinstaller打包exe,在64位机上运行正常。 但是目标电脑是32位的,所以需要打包32位exe,然后问题就出现了。

    打包32位exe, 虽然网上有教程说使用 Anaconda 生成python 的32位环境,我试了,但是没有成功,转而选择卸载64位python,不如直接装32位的python, 依旧使用pyinstaller 打包

    打包时虽然有几个警告但貌似还顺利,点开exe后报 "failed to execute script XXX",更换了多个python 版本,装了卸卸了装,翻了很多资料都没有解决,于是打算自力更生

    众所周知,可以用这条命令打包不带控制台的exe:

    pyinstaller -w -F  xxx.py 

    但这样就没办法看到报错了,因此保留控制台:

    pyinstaller -F  xxx.py 

    打包后,程序一闪而过,用手机开视频录下来(60fps), 画质很渣但是依然无法看漏“unable to find QtCore.dll on PATH”:

    问题应该就是丢失PyQt库了,少了就补上吧~ 直接将这个dll拷贝到 C:WindowsSystem32下,然后开开心心的点开exe,问题就解决了~.....才没有解决......

    需要把python的PyQt5库路径添加到环境变量PATH中才行,这回就真的能跑起来了,很开心(实际上到这一步折腾了很久),不过估计要在目标电脑装好PyQt5,然后添加环境变量,虽然有点麻烦但是能用。

    事情就这么告一段落了....

    才没有告一段落,我并不甘心,凭什么64位跑得好好的,32位就丢dll,凭什么命令行运行正常,exe就丢东西?而且我到exe的临时目录看了,实际上Qt5Core.dll等库都好好的躺在里面的,但是为什么就有说找不到,然后尝试了

    1. 把Qt5Core.dll强行再打包在exe中,这个可以编辑spec文件实现,改datas那行,不行!

    2. 尝试在运行时调整运行路径,或者添加临时路径,让程序可以识别原本就在同一层目录下的dll们,没有找到类似的教程(这样的需求本来就很奇怪吧?)

    3. 换了另一台试了下,建了个虚拟机试了下,以排除系统区别,不行

    4. 换了低版本的python 试了下,不行

    5. 尝试更换打包软件,好像大多都是pyinstaller,还有py_win32,cx_Freeze等,py_win32貌似需要重新写界面,cx_Freeze按例程跑了下一点效果都没有。

    费了很长时间,可以说很心累了,有幸看到了一篇博文:

    PyInstaller打包PyQT5的若干坑....

    标题可以看出很接近了,其实降低了PyQt5的版本就可以了,似乎不需要像这篇博文里面降低pyinstaller的版本(3.5),打包后不用添加环境变量也可以正常运行了,exe体积还降低了一半...

    一开始我用的PyQt5.13.0打包32位报错,降低到5.9.2就没问题了,顺便记一下pip安装指定版本的库:

    pip install pyqt5==5.9.2

    我喜欢把各种依赖的库写在一个cmd文件中,需要安装环境时双击一下就完事了

    总结一下就是:

    Pyinstaller打包PyQt5程序时,若提示丢失dll文件,可尝试降低PyQt5的版本,如pyinstaller3.5 + PyQt5.9.2组合 (@Windows 7 x64 SP1 + python 3.7.4 x32)

  • 相关阅读:
    第二周作业
    第一次作业
    第0次作业
    第一次的作业
    第0次作业
    第三次作业
    %f使用时的注意事项
    关于c++停止工作
    第二次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/caokang/p/11266013.html
Copyright © 2011-2022 走看看