pyinstaller打包单个exe后无法执行错误的解决方法


Posted in Python onJune 21, 2019

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打包执行不再出错。

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(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

以上这篇pyinstaller打包单个exe后无法执行错误的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中用keys()方法返回字典键的教程
May 21 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
使用tensorflow实现AlexNet
Nov 20 Python
python 字符串和整数的转换方法
Jun 25 Python
Python datetime包函数简单介绍
Aug 28 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
windows安装python超详细图文教程
May 21 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 #Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 #Python
十行代码使用Python写一个USB病毒
Jun 21 #Python
Python pandas DataFrame操作的实现代码
Jun 21 #Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 #Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 #Python
python之当你发现QTimer不能用时的解决方法
Jun 21 #Python
You might like
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
php创建类并调用的实例方法
2019/09/25 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
javascript event 事件解析
2011/01/31 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
解决python3 pika之连接断开的问题
2018/12/18 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python字典的遍历3种方法详解
2019/08/10 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
Python 如何在字符串中插入变量
2020/08/01 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
TCP/IP模型的分界线
2012/12/01 面试题
个人找工作求职简历的自我评价
2013/10/20 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
计生个人工作总结
2015/02/28 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
只用Python就可以制作的简单词云
2021/06/07 Python
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
python使用torch随机初始化参数
2022/03/22 Python