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实现2种文件复制的方法
Jan 19 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Django中使用Celery的方法示例
Nov 29 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
python实现邮件自动发送
Aug 10 Python
Python的几种主动结束程序方式
Nov 22 Python
Python之Class&Object用法详解
Dec 25 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 Python
Python paramiko使用方法代码汇总
Nov 20 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
python3 sqlite3限制条件查询的操作
Apr 07 Python
实战Python爬虫爬取酷我音乐
Apr 11 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
用php解析html的实现代码
2011/08/08 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
python通过http下载文件的方法详解
2019/07/26 Python
python将时分秒转换成秒的实例
2019/12/07 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
白莲教口号
2014/06/18 职场文书
档案工作汇报材料
2014/08/21 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题