利用pyinstaller生成exe文件碰到的一些问题及解决方法
在“开源图像标注工具labelme的安装使用及汉化”这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件,可以在Windows操作系统中直接运行,得到labelme图像标注工具软件界面,生成exe的过程中,碰到了一些问题,有的解决了,有的还没有解决,希望对从事这方面工作的朋友有帮助,也希望熟悉这类问题的大神们帮着解决下还没有解决的问题。
1 exe文件闪退问题
将labelme在pycharm中运行,直接运行main.py文件,可以正常运行,能够得到labelme的标注软件界面,说明程序能够正常运行。然后,使用pyinstall工具,在cmd的命令行中利用pyinstaller -F E:/ python_workspace/labelme/main.py生成main.exe文件,命令键入之后,需要耐心等待1-2分钟,直到出现Building EXE from EXE-00.toc completed successfully出现,说明exe文件生成成功了。

然后直接双击mian.exe,结果出现一个cmd窗口,很快就闪退了,labelme界面没有出现,cmd的报错信息也没有看到。
为了看到报错信息,我在cmd中,cd到main.exe所在的目录,然后直接键入main.exe,这时候main.exe就会运行,下面就会显示报错信息。

根据报错信息,可以看到,问题出在config/__init__.py文件上,软件启动需要读取default_config.yaml文件,这个文件就是在config目录下,生成exe文件之后,软件就找不到这个文件,我们去查看__init__.py的代码,找到一行代码,是读取default_config.yaml文件的。
config_file = osp.join(here, 'default_config.yaml')
此处的here是软件运行时的一个路径,os.path.join的路径,我们可以将这个路径写成绝对路径,比如我们直接将default_config.yaml文件放到d盘的labelme目录下,将以上代码修改为
#config_file = osp.join(here, 'default_config.yaml')
path = 'd:\\labelme'
config_file = osp.join(path, 'default_config.yaml')
再次使用pyinstaller,生成main.exe文件。
双击运行main.exe文件,可以进入labelme软件界面,闪退问题解决。
2 图标未显示问题
在icon中有一些图标,使用pycharm运行main.py可以正常显示图标,生成exe文件之后,图标都不能正常显示。
main.exe运行结果

在pycharm中的运行结果

查资料可知,应该是pyinstaller的问题,在转换为exe文件的时候将图片数据丢失了。
解决办法是使用base64来保存这些图标文件,这样在pyinstaller转化exe文件的时候,就不会存在处理图片的问题。这个方法,我没有通过实践测试,理论上是可行的,不过,我没有验证。
网上也有一些介绍打包图标的博客,修改图标的路径,打包的时候可以直接将图标打包到可执行文件中,该方法也没有测试验证。
3 某些机器不能运行的问题
生成的main.exe文件和default_config.yaml文件,都放到labelme文件夹中,然后将labelme文件夹拷贝到d盘根目录下,在多台计算机上测试运行。
3.1 双击运行main.exe
都是在windows系统64位机器上测试的,有的机器能够正常运行,有的机器报错。报错信息是“此应用无法在你的电脑上运行,若要找到适用于你的电脑的版本,请咨询软件发布者。”尝试解决,在百度中查找相关报错信息,提示是兼容性问题,点击右键,选择属性,在兼容性中勾选兼容运行,依然报错。
3.2 右键以管理员身份运行
提示“windows找不到文件main.exe。请确定文件名是否正确后,再试一次。” ,在百度中查找windows找不到文件等信息,采取了一些方法,比如利用sfc /scannow命令,扫描修复系统,执行后,main.exe依然不能打开。
3.3 在命令行运行
在cmd中,cd到labelme路径下,直接键入main.exe,报错信息为16位程序不能运行,系统将main.exe看作了16位的程序,阻止了程序的运行。然后查找不支持16位应用程序的解决办法,点击开始菜单,点击运行,输入gpedit.msc。选择计算机配置,选择管理模板,点击windows组件,点击应用程序兼容性。双击防止访问16位应用程序,点击已禁止,点击确定。我使用的笔记本上面是win10系统家庭版,还不能运行gpedit.msc,还需要查找,先解决运行组策略的问题。在记事本中,输入一下内容:
@echo off
pushd "%~dp0"
dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txt
dir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>gp.txt
for /f %%i in ('findstr /i . gp.txt 2^>nul') do dism /online /norestart /add-package:"%systemroot%\servicing\Packages\%%i"
pause
说明:通过dir命令遍历系统盘servicing目录,寻找组策略的配置包,找到后写入到gp.txt文件,然后通过dism命令来安装组策略包。
然后将文件另存为gpedit.bat文件,然后运行,这样就把组策略加入到系统中了。
4 结语
出现报错信息,可以采用多种方式运行程序,这样程序会呈现不一样的错误提示信息,有的错误提示信息很有用,比如闪退问题,在命令行运行,就会有一些有用的错误提示信息,最后exe不能运行的解决,也是在命令行运行,提示了16位程序的问题。通过测试不同的提示信息,找到解决方法。
利用pyinstaller生成exe文件碰到的一些问题及解决方法的更多相关文章
- 小白学Python(19): Pyinstaller 生成 exe 文件
python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块. 安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装 ...
- pyinstaller生成exe文件失败
我的python是3.6,目前pyinstaller并不支持,有网友建议在Github上下载源码,用pyinstaller_develop文件夹替换pyinstaller安装位置下同名文件夹.这样做之 ...
- 利用pyinstaller生成exe之后,运行不能正常产生结果文件问题记录
https://segmentfault.com/q/1010000011284617/a-1020000011493026 在此链接已解决问题,现在在这里在详细记录一次 问题描述: 利用pychar ...
- python3 pyinstaller生成exe文件过程问题解决记录
1.使用pip安装pyinstaller 2.在cmd打开需生成可执行文件的python文件所在文件夹 3.使用命令pyinstaller -F -w **.py (代码中有import其他模块的,只 ...
- 利用PyInstaller打包exe文件
前言 平常我们通过Python写完一些小脚本之后,如果使用不频繁的话,一般会选择在DOS界面直接跑脚本,或者在IDE中运行.但当我们需要频繁使用某些脚本,或者在没有Python环境的机器上也能顺利运行 ...
- PHP利用FTP上传文件连接超时之开启被动模式解决方法
初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...
- java应用程序利用Exe4j打包exe文件
1. 使用简介: 把java应用程序打成exe文件我们可以借助第三方软件exe4j来完成.Exe4j大家可以在网上下载,下载地址是: http://www.ej-technologies.c ...
- python——pyinstaller生成exe基本使用和遇到的坑
1.安装 pip install pyinstaller 2.常规操作 在cmd界面(之前安装python或者anaconda的时候正确添加环境变量的话,是可以在cmd界面直接执行pyinstalle ...
- Python 使用cx_freeze 生成exe文件【转】
Python 使用cx_freeze 生成exe文件 在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三 ...
随机推荐
- c++面试题总结(4)
一.找错题 试题1: void test1() { ]; "; strcpy( string, str1 ); } 试题2: void test2() { ],str1[]; int i; ...
- Drozer
Drozer原名mercury,是一款不错的Android APP安全评估工具.现在有社区版/专业版两个版本 本教程针对于Windows平台下drozer的安装与使用.使用该工具需要JDK的支持,所以 ...
- Linux - Unix环境高级编程(第三版) 代码编译
Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...
- 横跨十年CPU架构回顾
http://cpu.zol.com.cn/209/2092791_all.html#p2092791 本文导航 第1页:K7架构 打开AMD崛起大门的钥匙 第2页:玩破解 K7时代便已经拥有 第3页 ...
- iOS 身份证验证
- (void)onClickButton:(id) sender{ || tmp_txt.text.length == ) { NSString *emailRegex = @"^[0-9 ...
- Arcgis Engine(ae)接口详解(8):临时元素(element)
//主地图的地图(map)对象 IMap map = null; IActiveView activeView = null; //IGraphicsContainer用于操作临时元素,可以通过map ...
- 编译spark源码 Maven 、SBT 2种方式编译
由于实际环境较为复杂,从Spark官方下载二进制安装包可能不具有相关功能或不支持指定的软件版本,这就需要我们根据实际情况编译Spark源代码,生成所需要的部署包. Spark可以通过Maven和SBT ...
- BZOJ3260: 跳
BZOJ3260: 跳 Description 邪教喜欢在各种各样空间内跳.现在,邪教来到了一个二维平面. 在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点: (x-1, ...
- ALVtree 显示BOM结构
REPORT z_barry_alv_tree1_bom MESSAGE-ID oo. TABLES: stpox.INCLUDE <icon>. CLASS: cl_gui_col ...
- rails elasticsearch searchkick用法
1.安装elasticsearch 之前要先安装java8: 参考https://www.elastic.co/guide/en/elasticsearch/reference/current/zip ...