赞
踩
在Github发现一段代码:https://github.com/jkrauth/shg_frog/find/
main
感觉不错,经过下面三个步骤就能打开(不感兴趣就跳过):
安装过程(按照README.md):
一、先构建python37虚拟环境,并在虚拟环境中进行下面操作。【本电脑中在conda中新增python37虚拟环境,并在其中运行】
二、安装依赖包requirements.txt和Vimba SDK.exe并重启电脑。
三、在虚拟环境cd到该文件夹内执行命令:shg_frog 即可打开界面。但不能像说明书所写的加[-h],否则没有界面出来。
然后,然后,有以下几个问题:
一、除了在自己的环境中,其他小白用不了。用了原来的pyinstaller -F -w xxx.py神句,打包完也完全没反应。
二、内部的__main__函数,也不能运行。
请教了大神见证了一步步debug的过程。
将该文件夹整体用pycharm 的project工程打开。【重要,后面很多Debug操作都需要全局代码搜索】
找到原始文件夹shg_frog-main中的实际运行文件shg_frog下面的__main__.py函数,并RUN。
运行报错: from .model.frog import FROG
ImportError: attempted relative import with no known parent package
处理方法:--->直接删掉from .model.frog import FROG这个引入语句。再运行。继续报错:NameError: name 'FROG' is not defined。此时按照报错提示定位到问题行,发现FROG下面标红色波浪线,并给出改正提示。(如果不是用project打开,而是单个文件打开,没有此提示)
点击蓝色提示,会自动插入导入语句并修复Bug。此时发现导入的语句被替换如下:
from shg_frog.model.frog import FROG
说明每个编译器实际的导入语句是不同的,同样的道理编译器也自动修复了下面行:
from shg_frog.view.main_window import MainWindow
修正上面的导入错误后,__main__.py函数可以在pycharm中正常打开了。
在Pycharm中的底部Terminal中先cd到__main__.py所在的文件夹。然后运行以下祖传打包语句:
pyinstaller -F -w xxx.py
经过一分钟,没有报错,在dist文件夹中生成__main__.exe文件。
双击此exe文件出现报错:
Traceback (most recent call last):
File "shg_frog\__main__.py", line 42, in <module>
File "shg_frog\__main__.py", line 33, in main
File "shg_frog\model\frog.py", line 53, in __init__
File "shg_frog\model\frog.py", line 237, in __init__
File "shg_frog\helpers\file_handler.py", line 121, in load_parameters
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Z00639~1\\AppData\\Local\\Temp\\_MEI79842\\shg_frog\\data\\params.default'
我们发现,.exe依赖的文件路径竟然不在自己的文件夹,而在某个windows自己的文件夹。说明这个搜寻路径有问题,这会导致该exe文件在其他人的电脑上无法运转。可能是某个路径的定义出错了,应该改成相对路径。
通过下面若干行对问题逐层回溯,发现问题点在于倒数第二行,file_handler.py文件中的第121行。找到对应shg_frog\helpers\file_handler.py文件找到该句,鼠标,放在后,编译器给出提示,这个的定义位置:
鼠标ctrl+单击,定位到该变量的定义语句:
INTERNAL_DATA_DIR = pathlib.Path(__file__).parents[1] / 'data'
问一问chatgpt,这行代码的意思是:pathlib.Path(__file__).parents[1] / 'data'
,其中:
__file__
是当前文件的路径。pathlib.Path(__file__)
将当前文件的路径转换为一个Path对象。parents[1]
获取/ 'data'
将父目录和子目录"data"拼接起来。看起来没毛病,但实际上,但为何最后exe执行时才出现初始的报错?从上述的报错来看,其路径还是跑到了系统里。
猜想如果我们换种方式重写,可能就不会跑到系统里了。
于是,把上述语句改成另一种完全相同功能的写法:
INTERNAL_DATA_DIR =pathlib.Path.cwd() / 'data'
并重新使用pyinstaller再生成一次,报错:
PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\XXX\\Desktop\\shg_frog-main_another_try\\shg_frog-main\\shg_frog\\dist\\__main__.exe'
该报错,是由于之前使用pyinstaller时,没有关闭报错对话框导致的。关掉后,继续生成,过程中没有报错。打开生成的exe文件又开始报错;
Traceback (most recent call last):
File "shg_frog\__main__.py", line 42, in <module>
File "shg_frog\__main__.py", line 33, in main
File "shg_frog\model\frog.py", line 53, in __init__
File "shg_frog\model\frog.py", line 237, in __init__
File "shg_frog\helpers\file_handler.py", line 121, in load_parameters
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\XXX\\Desktop\\shg_frog-main_another_try\\shg_frog-main\\shg_frog\\dist\\data\\params.default'
从代码中可以看到,data路径是正确的,但缺少文件,所以要把data\文件夹也拷贝到dist文件夹中。
拷贝后,再运行exe文件继续新的报错:
Traceback (most recent call last):
File "shg_frog\__main__.py", line 42, in <module>
File "shg_frog\__main__.py", line 36, in main
File "shg_frog\view\main_window.py", line 55, in __init__
File "PyQt5\uic\__init__.py", line 241, in loadUi
File "PyQt5\uic\Loader\loader.py", line 66, in loadUi
File "PyQt5\uic\uiparser.py", line 1020, in parse
File "xml\etree\ElementTree.py", line 1197, in parse
File "xml\etree\ElementTree.py", line 587, in parse
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\XXX\\AppData\\Local\\Temp\\_MEI203802\\shg_frog\\view\\GUI\\main_window.ui'
从代码中可以看到,下面的GUI的寻找路径又不对了。继续向上看错误代码,在view\main_window中定义的路径,打开后代码如下:
- gui_path = pathlib.Path(__file__).parent / 'GUI'
- uic.loadUi(gui_path / 'main_window.ui', self)
估计也是用 pathlib.Path(__file__).parents[1]的锅,但是此时变成了.parent。所以,索性把所有的无论是pathlib.Path(__file__).parents[1]还是pathlib.Path(__file__).parent都使用ctrl+shift+R平替成pathlib.Path.cwd()。
再次运行pyinstaller,生成exe.并运行。报错:
Traceback (most recent call last):
File "shg_frog\__main__.py", line 42, in <module>
File "shg_frog\__main__.py", line 36, in main
File "shg_frog\view\main_window.py", line 55, in __init__
File "PyQt5\uic\__init__.py", line 241, in loadUi
File "PyQt5\uic\Loader\loader.py", line 66, in loadUi
File "PyQt5\uic\uiparser.py", line 1020, in parse
File "xml\etree\ElementTree.py", line 1197, in parse
File "xml\etree\ElementTree.py", line 587, in parse
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\XXX\\Desktop\\shg_frog-main_another_try\\shg_frog-main\\shg_frog\\dist\\GUI\\main_window.ui'
看到绿色路径已经正确了,只是缺少了GUI文件夹,把对应的GUI文件夹拷贝到其提示的的dist中。
Bingo!
此时程序正常运转。把该dist文件夹拷贝到另一台电脑,只要装了vimboc软件(原Github有说明)也能正常运转。
上述详细地叙述了,如何从Debug的提示,一步步修改了若干Bug,最终解决问题的步骤方法,仅作为案例参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。