pyinstaller打包python文件后,运行出现"Failed to execute script xxx.exe"

pyinstaller打包python文件后,运行出现"Failed to execute script xxx.exe"

  • 问题
    • 问题定位
    • 解决方法

问题

用pyinstaller打包,总会出现 Failed to execute script***,的提示。我找了很多资料。最后终于成功封装。记录下经过防止以后再次出现这问题。

问题定位

因为我之前没有截图,所以这里借用下前辈的材料。
1、先用pyinstaller打包个带控制台的exe

常用的参数用法:

–distpath : 打包到哪个目录下
-w: 指定生成 GUI 软件,也就是运行时不打开控制台
-c: 运行时打开控制台
-i : 指定打包后可执行文件的图标
–clean: 在构建之前清理PyInstaller缓存并删除临时文件
关于打包成什么样,有两种选择:

-D: 创建包含可执行文件的单文件夹包,同时会有一大堆依赖的 dll 文件,这是默认选项
-F: 只生成一个 .exe 文件,如果项目比较小的话可以用这个,但比较大的话就不推荐

2、执行查看问题出现什么提示

windows+r进入cmd命令行窗口
cd exe文件所在路径;如cd C:\Users\user\Desktop\test\dist
执行命令行:xxx.exe 参数1 参数2(无参数可忽略)

我是出现类似下面 unable to find qt5*** on path 的提示。这是没有设置环境变量的问题。
pyinstaller打包python文件后,运行出现

解决方法

有好多方法,最后我整理下对我有效的:
1、在打包时指明pyqt动态链接库的位置。
切换到要打包的.py文件所在的目录,在此路径打开命令行:

pyinstaller --paths "D:\Program Files (x86)\Python35-32\Lib\site-packages\PyQt5\Qt\bin" -Fw test.py

其中,–paths后跟着的是本机pyqt动态链接库的位置,test.py是打包的文件。
也可以把pyqt的动态链接库路径添加到系统的环境变量中,这样就可以不用每次输入一长串的paths参数。

2、如果第一步执行后 exe成功了,那么恭喜你。
然而我的打包程序还是没成功。所以我继续找啊找。
终于救星出现了:

if hasattr(sys, 'frozen'):
    os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

有大佬说在.py脚本里,在导入pyqt5包之前加上如代码。
实例如下:


import sys
import os
if hasattr(sys, 'frozen'):
    os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

from PyQt5.QtWidgets import QApplication, QMainWindow
from pyqt_ui.MainWindow import MainWin

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = QMainWindow()
    main_dialog = MainWin(mainWindow)
    mainWindow.show()
    sys.exit(app.exec_())

我试运行,哈哈!exe终于运行成功,感谢各位前辈。

你可能感兴趣的:(pyinstaller打包python文件后,运行出现"Failed to execute script xxx.exe")