labelImg的运行环境配置与pyinstaller打包过程

作者:Kinglong    发表时间:2022-08-24 23:24   

关键词:图像标注项目  labelImg  pyinstaller  

1.更新pip

c:\python39\python.exe -m pip install --upgrade pip
 

2.解决pyrcc5报错,安装pyrcc5

pip install PyQt5
pip install pyqt5-tools
 
如果pip安装pyqt5太慢,改成以下方式
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
 

3.安装 lxml

 pip install lxml

4.编译资源文件resources.qrc

将Qt文件格式转换为Python格式,在labelImg-master目录下运行
pyrcc5 -o resources.py resources.qrc
pyrcc -o resources.py resources.qrc
 
改用:
python -m PyQt5.pyrcc_main resources.qrc -o resources.py 报错 File "labelImg-master\labelImg.py", line 31, in <module>
ModuleNotFoundError: No module named 'libs'
 
改用:Terminal下运行:
pyrcc5 -o libs/resources.py resources.qrc
 
改用:
python -m PyQt5.pyrcc_main resources.qrc -o resources.py
 

5.复制resources.py文件到libs

将上一个步骤生成的resources.py文件,复制到libs文件夹下.

6.运行labelImg.py

不打包,直接运行labelImg.py,即可进行标注操作
报错 dist.py:275: UserWarning: Unknown distribution option: 'app'
pip install wheel
pip install numpy
加速安装 pip install numpy -i https://pypi.doubanio.com/simple/

7.pyinstaller打包 labelImg.py生成exe

Terminal运行: pyinstaller -F -w labelImg.py,进行打包
(1)打包过程报错 upx is not available. 
      这条有这个提示, 后面的打包肯定不能正常完成了!
     下载安装UPX.exe(https://upx.github.io/,https://github.com/upx/upx/releases), 下载下来是一个压缩包,解压,把exe文件拷贝到pyinstaller目录下, 我的是 C:\Python39\Scripts\
     打包成功。
 (2)运行exe报错,找不到libs模块,打包没有包含该模块。
  报错:Traceback (most recent call last):
  File "labelImg-master\labelImg.py", line 31, in <module> ModuleNotFoundError: No module named 'libs'
  修改打包命令,使包含libs。Terminal运行:pyinstaller -F -w labelImg.py -p ./libs -p ./

8.编译后的labelImg.exe不加载data中的配置文件

运行没有事,编译后不加载data中的配置文件。
用“显示控制台”命令打包,运行时报错 “Not find:/data/predefined_classes.txt (optional)”
打印参数发现路径的前缀不对,不是exe所在目录:args.class_file:C:\Users\HT007\AppData\Local\Temp\_MEI244802\data\predefined_classes.txt

原因:python3下,打包成exe后,data目录路径不能再用__file__来定位,而应该用sys.executable定位。
解决思路:调试模式下sys.executable得到python.exe文件路径,打包成exe后sys.executable得到labelImg.exe文件路径。利用二者区别,对打包成exe的情况,根据labelImg.exe重新定位data所在目录。修改abelImg.py文件的代码如下:
    # argparser.add_argument("class_file",
    #                        default=os.path.join(os.path.dirname(__file__), "data", "predefined_classes.txt"),
    #                        nargs="?")
    base_dir = os.path.dirname(__file__)
    if sys.executable.find("labelImg.exe") > 0:
        base_dir = os.path.dirname(os.path.realpath(sys.executable))
    argparser.add_argument("class_file",
                           default=os.path.join(base_dir, "data", "predefined_classes.txt"),
                           nargs="?")

9. 处理输出json格式时的中文乱码情况

参考:https://blog.csdn.net/qq_26502245/article/details/122072396

# Path(self.output_file).write_text(json.dumps(output_dict), ENCODE_METHOD)
Path(self.output_file).write_text(json.dumps(output_dict, ensure_ascii=False), ENCODE_METHOD)