当前位置:   article > 正文

Github上某代码本地化进行封装exe出现的问题及Debug过程_github代码打包为exe

github代码打包为exe

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的过程。

封装Debug过程如下:

一、定位主函数,解决该程序在Pycharm中无法正常运行问题。

将该文件夹整体用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中正常打开了。

二、解决无法打包成exe的问题:

在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"拼接起来。
  • 在该语句设置断点,使用Debug run功能。然后选中该句的pathlib.Path(__file__).parents[1]并右击->evaluate expression。可以看出来其实际运行时生成的代码位置应该是对的。

         看起来没毛病,但实际上,但为何最后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中定义的路径,打开后代码如下:

  1. gui_path = pathlib.Path(__file__).parent / 'GUI'
  2. 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,最终解决问题的步骤方法,仅作为案例参考。


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/554694
推荐阅读
相关标签
  

闽ICP备14008679号