pyinstaller打包单个exe后⽆法执⾏错误的解决⽅法
1、执⾏环境说明
python版本3.7
直接使⽤pip进⾏安装pywin32、pyinstaller
pip install pywin32
pip install pyinstaller
python安装教程非常详细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
quirements
当然,six和packaging库建议使⽤pip安装。加⼊以上库后,使⽤pyinstaller -D code.py打包执⾏不再出错。
4、不到数据⽂件夹
有些程序包含了数据⽂件夹,不能直接按资源⽂件⽅式打包,需要在执⾏⽂件所在的⽂件夹内创建这些数据⽂件。⼀般情况下在脚本中我们可以使⽤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(utable)))
print(os.path.dirname(alpath(sys.argv[0])))
得到的结果是os.path.dirname(utable))和os.path.dirname(alpath(sys.argv[0]))才是含数据⽂件夹的路径。因此可以按如下⽅式取得⽂件路径,然后根据需要拼接得到数据⽂件夹的真实路径:
if hasattr(sys, '_MEIPASS'):
# PyInstaller会创建临时⽂件夹temp
# 并把路径存储在_MEIPASS中
self.appPath = os.path.dirname(utable))
else:
self.appPath, filename = os.path.split(os.path.abspath( __file__))
修改完成后,分别以以下三种⽅式打包,运⾏成功
pyinstaller -D code.py
pyinstaller -F code.py
pyinstaller -w -F code.py
以上这篇pyinstaller打包单个exe后⽆法执⾏错误的解决⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。