【已解决】py运行没问题,打包成exe的各种报错

代码环境:Windows11,pycharm2023.2.3,python3.12,用到包pymzml2.5.2,初学者

先按网络教程在虚拟环境中将正常运行的py项目打包,mark_tool.py是我的主程序。

pyinstaller -D -c .\mark_tool.py

1.提示缺少文件FileNotFoundError: [Errno 2] No such file or directory: 'D:\\Bionet\\myGUI\\dist\\mark_tool\\_internal\\pymzml\\version.txt'

-c参数是运行程序时显示控制台,方便我们调试。运行打包后的程序,控制台随着程序闪退。

为了看到报错信息,使用win+R,cmd运行程序,此时可看到报错

这个错误比较常规,通过网络得到解决方案,打包时加入参数--add-binary强制引入缺失文件

pyinstaller -D -c .\mark_tool.py --add-binary=".venv/Lib/site-packages/pymzml/version.txt:pymzml"

重新打包,程序正常运行

2.使用pymzml包的功能,闪退报错

正常运行后点击某些需要调用pymzml包的功能,闪退报错

①AttributeError: module 'urllib' has no attribute 'request'

因为不熟悉pymzml包的运作原理,直接将报错复制上网搜索,按照这个博文所述引入request模块解决 AttributeError: module 'urllib' has no attribute 'request'-CSDN博客

重新打包运行,报错更新

②urllib.error.URLError: <urlopen error [Errno 11004] getaddrinfo failed>

这个报错我查了很久,都是说dns问题、网络连接问题。但是我写的程序并没有需要联网的地方,查看错误堆栈就是调用pymzml之后进行了联网操作。但是我直接运行py却不会报这个错,我以为是打包过程中又缺失了文件导致它需要去下载,又查了很多打包相关的内容,都不行。终于决定根据堆栈去看看源码到底怎么回事。

根据堆栈打开pymzml\obo.py文件,定位到152行,发现这里确实进行了联网操作

我在浏览器打开这个链接,提示“页面可能存在问题,或者已永久移动到新的网址”。所以,就是这个网址的问题了。我尝试直接将151、152行屏蔽,重新打包。报错更新

③成功近在咫尺!

这个报错就又是很直白的报错了。程序运行目录下缺少obo\psi-ms-1.1.0.obo这个文件,那个网址就是为了下载这个文件的。既然我们py运行没问题,说明我们本地是有这个文件的。不知道是不是也可以强制打包,我是直接将环境目录中的文件拷贝到运行目录中了,这个文件也很好找就在pymzml安装目录里

直接将obo目录拷到exe同级目录,此时再运行程序,可以正常使用啦!

3.后记

对自己的几点建议:

①遇到不熟悉的报错,在查到错误代码对应的可能问题后,还是要先自己根据错误堆栈,回到源码中去排查问题,每个人遇到的问题不尽相同,不可能完全依赖他人经验来debug

②可以看到,在打包pymzml相关内容时,除了py文件全部没有打包进去,包括第一点中的那个version.txt。是不是有什么更好的方法可以将全部所需的内容都打包进去,有待进一步学习

③虚拟环境是个好文明,虽然我还没有体验到它打包程序能减小体积的优势,但是像这样在其中修改python包就不会影响其他项目了。并且我前不久刚换新电脑,配置环境下载各种模块又是一头包,然而我将原来带有虚拟环境的项目直接拷贝到新电脑上就能用,简直不要太方便

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值