在“开源图像标注工具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文件碰到的一些问题及解决方法的更多相关文章

  1. 小白学Python(19): Pyinstaller 生成 exe 文件

    python 默认并不包含 PyInstaller 模块,因此需要自行安装 PyInstaller 模块. 安装 PyInstaller 模块与安装其他 Python 模块一样,使用 pip 命令安装 ...

  2. pyinstaller生成exe文件失败

    我的python是3.6,目前pyinstaller并不支持,有网友建议在Github上下载源码,用pyinstaller_develop文件夹替换pyinstaller安装位置下同名文件夹.这样做之 ...

  3. 利用pyinstaller生成exe之后,运行不能正常产生结果文件问题记录

    https://segmentfault.com/q/1010000011284617/a-1020000011493026 在此链接已解决问题,现在在这里在详细记录一次 问题描述: 利用pychar ...

  4. python3 pyinstaller生成exe文件过程问题解决记录

    1.使用pip安装pyinstaller 2.在cmd打开需生成可执行文件的python文件所在文件夹 3.使用命令pyinstaller -F -w **.py (代码中有import其他模块的,只 ...

  5. 利用PyInstaller打包exe文件

    前言 平常我们通过Python写完一些小脚本之后,如果使用不频繁的话,一般会选择在DOS界面直接跑脚本,或者在IDE中运行.但当我们需要频繁使用某些脚本,或者在没有Python环境的机器上也能顺利运行 ...

  6. PHP利用FTP上传文件连接超时之开启被动模式解决方法

    初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...

  7. java应用程序利用Exe4j打包exe文件

    1.      使用简介: 把java应用程序打成exe文件我们可以借助第三方软件exe4j来完成.Exe4j大家可以在网上下载,下载地址是: http://www.ej-technologies.c ...

  8. python——pyinstaller生成exe基本使用和遇到的坑

    1.安装 pip install pyinstaller 2.常规操作 在cmd界面(之前安装python或者anaconda的时候正确添加环境变量的话,是可以在cmd界面直接执行pyinstalle ...

  9. Python 使用cx_freeze 生成exe文件【转】

    Python 使用cx_freeze 生成exe文件   在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三 ...

随机推荐

  1. java开始到熟悉62

    (说明:昨天网络出现了问题导致昨天的没有按时上传,这篇算是昨天的,今天晚上照常上传今天的内容) 本次主题:数组拷贝.排序.二分法 1.数组拷贝 a.java.lang中System 类包含一些有用的类 ...

  2. deepin os 15.4 切换jdk版本

    sudo update-alternatives --config javasudo update-alternatives --config javacsudo update-alternative ...

  3. 基于ADB框架Robotium跨进程操作

    转自:http://blog.csdn.net/qingchunjun/article/details/42580937 2015年2月3日更新: 有些朋友在用真机尝试本方法时,抛出了InputStr ...

  4. 图像处理之 opencv 学习---opencv 中的常用算法

    http://blog.csdn.net/lindazhou2005/article/details/1534234 文中有提到鲁棒性 http://blog.csdn.net/chary8088/a ...

  5. Hadoop之HDFS文件操作

    摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件    命令行     Java API HD ...

  6. Class.forName("java.lang.String")的作用?

    返回字节码: 返回的方式有2种: 第一种是这个类的字节码已经加载到内存里面来了,现在想要取到它的字节码,我直接找到那份字节码把他返回: 第二种是我去得到这个类的字节码,结果在虚拟机里面还没有这个类的字 ...

  7. Oracle数据库案例整理-Oracle系统执行时故障-断电导致数据文件状态变为RECOVER

    1.1      现象描写叙述异常断电.数据库数据文件的状态由ONLINE变为RECOVER. 系统显演示样例如以下信息:SQL>selectfile_name,tablespace_name, ...

  8. var和let的区别(详解)

    1. 作用域 通过var定义的变量,作用域是整个封闭函数,是全域的 . 通过let定义的变量,作用域是在块级或是子块中. function varTest() { var x = 1; if (tru ...

  9. install build tools 25.0.2 and sync the project

    install build tools 25.0.2 and sync the project in android studio bundle.gradle,将buildToolsVersion修改 ...

  10. HDU1964 Pipes —— 插头DP

    题目链接:https://vjudge.net/problem/HDU-1964 Pipes Time Limit: 5000/1000 MS (Java/Others)    Memory Limi ...