利用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恐怕是三 ...
随机推荐
- FragmentSharedFabTransition
https://github.com/lgvalle/FragmentSharedFabTransition
- 关于Widget预览图的改动
在做项目时候,由于常常不带GPS功能.所以在有些细节上须要做处理,当中之中的一个就是.快捷开关的预览图和实际效果图的差异 在我们快捷开关的预览图中,总是能够看到五个快捷开关,事实上就包含GPS信息 而 ...
- stm32GPIO8种模式
stm32GPIO工作模式及用途 1.浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1 2.带上拉输入GPIO_IPU——IO内部上拉电阻输入 ...
- (白书训练计划)UVa 11572 Unique Snowflakes(窗体滑动法)
题目地址:UVa 11572 这样的方法曾经接触过,定义两个指针,不断从左向右滑动,推断指针内的是否符合要求. 这个题为了能高速推断是否有这个数,能够用STL中的set. 代码例如以下: #inclu ...
- XFire WebService demo
XFire创建WebService实例应用 XFire使得在JavaEE应用中发布Web服务变得轻而易举.和其他Web服务引擎相比, XFire的配置非常简单,可以非常容易地和Spring集成. ...
- 注意css 小细节 颜色能缩写尽量缩写
如 background: #333333; 改为 background: #333;
- python模拟登陆discuz论坛
#! /usr/bin/env python # -*- coding: utf-8 -*- import urllib2, urllib, cookielib, re, time class Rob ...
- docker pure-ftp 搭建ftp服务器
参考:https://hub.docker.com/r/stilliard/pure-ftpd/ docker-compose.yml: ftp: image: stilliard/pure-ftpd ...
- DataContractAttribute.IsReference
IsReference property in data contract It determines how objects are serialized, by default, IsRefere ...
- 2016-5-23 jsp
1.table的边框:rules这个参数,它有三个值(cols,rows,none),当rules=cols时,表格会隐藏横向的分隔线,也就是我们只能看到表格的列:当rules=rows时,就隐藏了纵 ...