.py文件转成.exe文件的十几种试错方法,希望有你用得上的

        py文件转成exe文件是真的有着巨多的坑,反正对于新手的我来说是如此,下面是我整个的试错过程以及一些思路,应该来说是几乎涵盖了我能找到的所有的方法。希望能够对你有所帮助,而不是‘看君一段字,如看一段字’。

        首先,我的需求是要将项目的mainwindow.py文件封装成exe文件,这样给客户验收时客户就可以少安装许多的第三方软件包。

        好啦,说完了需求,然后进入正文吧

1.   我一上来就遇到一个问题,就是将工程文件整个拷贝到我的电脑中的时候,就直接报错各种导包失败,但是该文件明明就在我运行的文件的路径下,就觉得很离谱,怎么就找不到呢?

解决方法:使用pycharm(我之前一直使用的vscode),在当前文件下,右键找到mark  Directory as(鼠标放在文件夹上,右键!!!),然后选择source root,哪个文件找不到,就按照这个方法把文件路径添加进去。

2. AttributeError: Module 'PyQt5' has no attribute '__version__',解决方案:重新安装pyqt5,指定好版本(这个要看你之前是用什么版本开发的),我估计是运行环境的变化问题,重新安装一次所依赖的第三方库吧,省的麻烦,之前一直是在虚拟环境中弄的,但是现在实在cmd命令行中进行打包。

3. 打包后的.exe文件无法正常使用

它提示是说没有这个模块,但是我的文件中明明是有这个模块的呀,且GUI.py文件能够成功运行,我就思考,是不是还是没有找到这个文件呢?于是我尝试了我关于这个问题的第一种解决方案,就是把这些找不到的文件的路径全部按照我一开始的那种方法,把它们都添加进root路径中,然后再重新打包,然而并没有什么用。

随后我看到有的博客说直接把这些出错的进行屏蔽就好了,我于是进行了第二种解决方案的尝试,即把这几个出错文件全都加入都屏蔽中,具体操作是这样的,在我们尝试打包的那个py文件的路径下,会有一个.spec文件,直接用记事本打开它

 

 然后找到hiddenimport,把需要屏蔽的import添加进去

 并且用这个spec文件去生成exe文件,方法就很简单,就把之前命令中的.py换成.spec就行,因为这两个文件的文件名称是一样的,只不过后缀不一样。然后还是报错,报错信息还是向之前那样。

随后我立即进行了第三种解决方案的尝试,就是将spec文件进行更改后,然后直接使用.py文件进行生成,但是还是失败了,报错信息还是一样,但是报错的界面是不一样了。变成了这样

 然后我就想,是不是需要在pyinstaller.exe文件的路径下进行打包呢,我就进行了第四种解决方案的尝试,在pyinstaller.exe文件的路径下进行转化,就是说输入:D:\work\anaconda\Scripts>pyinstaller.exe -F D:\ScenariosV1\MainWindow.py

然而也并没有解决问题,随后我就想,会不会是因为-F的问题?-F就是将所有依赖以及库打包成一个exe文件,这样这个exe文件非常的巨大,会不会是这种打包方式的问题导致出错呢?于是我就进行了第五种解决方案的尝试,即不使用-F打包,然而还是失败了。

然后我又看到一篇博客,内容我记不太清楚了,具体意思应该是pyinstaller在打包的时候,如果mainwindow.py的目录下还有一些平级的py的话,pyinstaller就分不清楚谁是主文件入口,谁是导入文件。所以就会出现找不到模块的错误ModuleNotFoundError: No module named 'xxx',于是我就进行了第六种解决方案的尝试,即把其他py文件都放到目录下,保证项目下只有一个mainwindow.py文件。然后再一次失败。。

紧接着我思考,是不是.spec文件的屏蔽没有产生作用?,我明明添加了hidden-import,正常按照网上的所说的话,应该是可以用的呀,只是可能功能上会有所欠缺,但是打包成功之后应该是可以运行的,于是我进行了第七种解决方案的尝试,即直接在命令行对这个出错的包进行忽略,也就是说输入:pyinstaller -F --hidden-import=myVideoWidget main.py,忽略报错的这个包。然而解决失败,报错信息依然一样。啊啊啊我要疯了。

随后我看到了一篇博客,说是如果打包的主程序中有调用自编模块的话,运行exe会出现找不到的问题

于是我进行了第八种解决方法尝试加入myVideoWidget模块的路径进行打包,输入:>pyinstaller main.py -F -p D:\ScenariosV1\ui,-p后面的这个路径就是我一直报错的myVideoWidget这个模块的路径。感谢天!尽管还是报错,但是出现的是不一样的错误了。说是找不到cv2这个模块,这个时

说是找不到cv2这个模块,这个时侯我心里大概有点数了,应该就是要把这些个自编模块还有第三方模块的路径也全都要添加进去进行打包。于是我第九次进行尝试,即将所有可能用到的自编模块或者第三方模块路径全部添加进去进行打包,我已经顾不得这个exe打包出来会很大了,我现在就是想让它能够运行!具体操作方法就是,改spec文件,在pathex这一项中把这些路径全部添加进去,然后再用spec文件生成exe文件

 然后又出现了新的问题,读取的路径莫名其妙改到了c盘下的一个奇奇怪怪的路径,啊啊啊,怎么这么难搞哦

明明我在pycharm中输出的都不是这个路径,这里运行就变成这样了,这里我对路径的代码进行了各种尝试各种更改,最终取得了成功,中间的各种尝试我就不赘述了,直接说结论吧,就是exe文件只能识别四种路径,分别为:

print(sys.path[0])

print(sys.argv[0])

print(os.path.dirname(os.path.realpath(sys.executable)))

print(os.path.dirname(os.path.realpath(sys.argv[0])))

具体情况参考:

python-pyinstaller、打包后获取路径_aiyaya2的专栏-CSDN博客_pyinstaller输出路径

 于是我进行了第n次解决方案进行尝试,即:把我的工程文件中的所有的代码的os.path.dirname(__file__)改成os.path.dirname(os.path.realpath(sys.argv[0])),最终终于成功!!感谢天感谢地!我激动得当场从椅子上站起来。

说在最后的话:这是我第一次写一篇博客,主要还是感觉网络上虽然各种资源与解决方案都很多,但是实际涉及到具体问题的话又其实很少。很少有人对整个调错的过程进行总结,每个人遇到的问题不一样,如果不把自己遇到的具体问题描述清楚的话其实对于其他人来说也许没太大作用,所以我尝试尽可能详细的描述我遇到的问题以及当时的心态。希望这样能够更大可能的帮助到陌生的你!本人水平有限,文章中肯定有很多说的不太对的地方,请大家在评论指正!相互学习相互进步嘛!感谢

 

 

 

 

 

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值