pyinstaller打包exe后无法执行错误解决

1、执行环境说明
python版本3.7
直接使用pip进行安装pywin32、pyinstaller
pip install pywin32
pip install pyinstaller

2、使用了第三方库的情况
建议在打包之前务必找到第三方库的包,把包复制到到跟myfile.py同目录下,然后再使用以上2种方式打包,否则会打包失败或者即使打包成功,程序也会闪退。pyinstaller -p参数是添加的pyinstaller打包程序时的扫描路径,假设venv\Lib\site-packages是包存放路径,那么也可以使用以下命令打包:

pyinstaller -p venv\Lib\site-packages -F xxx.py

3、failed to execute script 错误,缺少依赖库。
首先使用
pyinstaller -F -w code.py
进行exe打包,得到的单个.exe文件,运行后提示failed to execute script 错误
排错过程:使用pyinstaller -D code.py进行exe打包,得到一个目录文件,通过命令行执行.exe文件提示The 'six' package is required; normally this is bundled with this package错误
说明pyinstaller打包后,需要six等库,最终确认需要在code.py中添加以下库:
import six
import packaging
import packaging.version
import packaging.specifiers
import packaging.requirements
当然,six和packaging库建议使用pip安装。加入以上库后,使用pyinstaller -D code.py打包执行不再出错。

另:1)pyinstaller -p 库路径 ,-p参数是导入库的目录,将会将该库路径下的库都打包进来

     2) --hidden-import 包名, 将导入指定隐藏库

这两种方法都可以将需要的库打包进去.

4、failed to execute script 错误,使用pyinstaller -D code.py进行exe打包,执行后提示 “unable to find Qt5Core.dll on PATH”,如下图:

参考:pyqt5 - How to fix "ImportError: unable to find Qt5Core.dll on PATH" after pyinstaller bundled the python application - Stack Overflow

https://github.com/pyinstaller/pyinstaller/issues/4293

pyqt5库对系统变量的加载存在bug,在主程序中pyqt5库import之前就对系统变量进行手动设置,import代码如下:

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

5、failed to execute script 错误,使用pyinstaller -D code.py进行exe打包,执行后提示 ImportError: DLL load failed while importing win32api: 找不到指定的模块。

上面的错误,就是import win32api,打包后缺少运行dll引起的。

将python\Lib\site-packages\pywin32_system32中的dll文件拷贝过来就行了。

6、找不到数据文件夹

有些程序包含了数据文件夹,不能直接按资源文件方式打包,需要在执行文件所在的文件夹内创建这些数据文件。一般情况下在脚本中我们可以使用os.path.split(os.path.abspath( __file__))来的到code.py的路径,然后拼接得到数据文件夹。但之后使用pyinstaller -F code.py打包成单个exe文件,在未读取数据文件夹的情况下运行正常,一旦打开数据文件,就会闪退,命令行窗口会显示打不开数据文件。因为PyInstaller会创建临时文件夹temp,程序代码在这个临时文件夹中运行,我们可以用以下几个语句来查看正式运行路径:
    import sys
    import os
    print(sys.path[0])
    print(sys.argv[0])
    print(os.path.dirname(os.path.realpath(sys.executable)))
    print(os.path.dirname(os.path.realpath(sys.argv[0])))

得到的结果是os.path.dirname(os.path.realpath(sys.executable))和os.path.dirname(os.path.realpath(sys.argv[0]))才是含数据文件夹的路径。因此可以按如下方式取得文件路径,然后根据需要拼接得到数据文件夹的真实路径:
    if hasattr(sys, '_MEIPASS'):
    # PyInstaller会创建临时文件夹temp
    # 并把路径存储在_MEIPASS中
        self.appPath = os.path.dirname(os.path.realpath(sys.executable))
    else:
        self.appPath, filename = os.path.split(os.path.abspath( __file__))

修改完成后,分别以以下三种方式打包,运行成功
pyinstaller -D code.py
pyinstaller -F code.py
pyinstaller -w -F code.py

7、在开发过程中,我们经常需要引入静态资源,在使用Pyinstaller打包时,这些静态资源需要使用--add-data参数打包进可执行文件

pyinstaller -w -F --add-data assets;assets  main.py

但在Pyinstaller 6.0.0以后,--add-data参数中的文件会被默认打包进_internal文件夹

方法一:使用__file__定位静态资源

os.path.join(os.path.dirname(__file__), ('assets/a.jpg'))

方法二:-contents-directory可以指定静态资源文件目录,我们指定--contents-directory .就可以像旧版本一样打包了

pyinstaller -w -F --add-data assets;assets  --contents-directory . main.py

本部份内容参考pyinstaller遇到的坑:--add-data参数中的文件被打包进_internal文件夹_pyinstaller --add-data-CSDN博客

8、最近需要在统信UOS下发布,运行时tkinter时显示No Module named _tkinter等,这是因为系统python3组件安装不完全,需要安装组件,如:

sudo apt-get install python3-tk
pip3 install lxml
sudo apt-get install python3-pil python3-pil.imagetk

然后使用python3 test.py运行成功,但使用pyinstaller打包后,运行执行文件仍显示No Module named PIL._tkinter_finder等,这是因为有些隐含库pyinstaller没有打包进来。后来的办法是:

在编译pyinstaller -F test.py生成的test.spec中加入缺少的库:

即原来的文件test.spec中

hiddenimports=[],

现在改为:

hiddenimports=['tkinter','PIL','PIL._tkinter_finder'],

然后对test.spec编译

pyinstaller test.spec
                        
本部分参考原文链接:https://blog.csdn.net/weixin_40755306/article/details/88880234

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值