pyinstaller打包exe问题:AttributeError、setuptools、DLL和PyQt5

版权声明:转载请标明出处 https://blog.csdn.net/qq_41556318/article/details/84980387

之前写的一个Python程序,打包为 .exe 完全正常,这次却报错。还不知道如何将.py文件转为.exe文件的可以查看:

将Python程序(.py)转换为Windows可执行文件(.exe)

一、背景介绍

    公司使用的python环境是Anconda+Python3.6,64位系统。

    有一个py程序主要是图像批量处理相关的,涉及到文件遍历、字符串拼接,于是“自然而然地”在用pyinstaller打包的时候遇到了这个经典报错信息:

AttributeError: 'str' object has no attribute 'items'

二、攻克

    1.百度查了很多资料无果,在同事的帮助下“科学上网”,很快就精确地找到了一些高人的回复,在试了很多方案之后,终于找到了【对症的药】。

    2.首先,因为问题都是出在pyinstaller上,网上有很多人遇到pyinstaller装错32位或64位版本的,在这里提供一个最简单的方法,写一个hello world的py程序,如果这个能成功打包exe文件并成功运行,说明和pyinstaller无关,你的环境是对的,只是缺少“一些”第三方依赖文件。(因为之前我写的)

    3.通过查阅stackoverflow上的类似的回答可以得知——报错虽然是在最后一行,但是向上滚动日志,可以发现一句话,意思差不多是缺少某个模块(Moudle),我照着回答者的方式往自己的DOS输出日志上看,找到了:

No moudle named “setuptools._vender”

因为这句报错是在前面,所以它才是导致最终打包失败的原因。当然,这只是针对我的电脑的情况,大家可以根据自己出现的报错去装对应的文件。

网上说的用pip install setuptools的方法对我无效,使用pip install -U setuptools或者pip install --upgrade setuptools出错,遇到各种坑。尝试使用easy_install -U setuptools同理错误。

(你们可以先试一下上面的pip install setuptools、pip install -U setuptools、pip install --upgrade setuptools和easy_install -U setuptools,如果成功了,就不用去下载最新版的了

没办法直接去下载最新的升级吧,网站为: https://pypi.python.org/pypi/setuptools#unix-wget 解决,这个网站在国内有时候会失效(昨天晚上下载了可以,今天早上写文章就打不开了,算了,直接上传我下载的资源吧 -> 传送门(我这里选择下载的是 .whl 文件))

接下来就是安装 setuptools-40.6.3-py2.py3-none-any.whl 安装包了,不清楚怎么安装的可以查看:python怎样安装whl文件

  4.更新完之后,果然这个报错消失了,然而,打包进程又中断了,这次报错是在 PyQt5. 行了!

很熟了,来吧:

pip install PyQt5

失败,timeout,你知道是为什么吗?原因如下:

我们需要安装的python包一般通过pip工具下载,而pip的源地址是官方网址:pypi.python.org,网络协议:HTTPS。

但是我们在国内的某些站点下载速度特别慢!!!然后就会出现下载失败timeout的情况。出现这种情况有可能是网速慢或者是被限制了。

所以我们选择使用国内的镜像网站:

命令为:

pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 模块名

如图:终于成功了!

C:\Users\XiangyangDai>pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com PyQt5
Looking in indexes: http://pypi.douban.com/simple
Collecting PyQt5
  Downloading http://pypi.doubanio.com/packages/a7/2d/d2c989006c86ae98ed230c28c3e0dd7fa0374e723afc107d12268159ceb7/PyQt5-5.11.3-5.11.2-cp35.cp36.cp37.cp38-none-win_amd64.whl (93.4MB)
    100% |████████████████████████████████| 93.4MB 9.9MB/s
Collecting PyQt5_sip<4.20,>=4.19.11 (from PyQt5)
  Downloading http://pypi.doubanio.com/packages/7e/80/71def6408143513d98a9c3ec297ddcd1b5e558337183be13bd5489aac5d0/PyQt5_sip-4.19.13-cp35-none-win_amd64.whl (51kB)
    100% |████████████████████████████████| 61kB 1.7MB/s
Installing collected packages: PyQt5-sip, PyQt5
Successfully installed PyQt5-5.11.3 PyQt5-sip-4.19.13

5.我们再来对编写的 Python 文件进行打包为 exe 文件的操作,终于又失败了(无语)。先来看看错误在哪里吧,

ImportError: DLL load failed: 找不到指定的模块

这个问题之前也出现过,解决简单,查看 ->

Python3解决问题:ImportError: DLL load failed: 找不到指定的模块问题解决

还是报错,我就猜想是PyQt5的原因,在IDLE中试一下,果不其然

>>> from PyQt5 import QtCore
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    from PyQt5 import QtCore
ImportError: DLL load failed: 找不到指定的模块。

解决方案如下:

1.首先你需要安装python3.x(或2.x,具体看个人情况,本文均以3.x为例),如果你已经像我一样已经安装了“python3.6.0(Anaconda)”。那么请再去python.org 下载适合你电脑配置的安装包,很重要的!!(我的系统是Windows10,64位,所以选择的是Download Windows x86-64 executable installer),然后安装,要确保你要记得它的安装目录哦,后面要用到。
2.OK,到这里,你需要确保已经完成上面的安装。如果你像我一样安装的Anaconda,那么就需要这个步骤,如果不是的话请忽略,并自动跳到下一步。 
3.打开刚刚记得的安装目录,找到python3.dll文件,复制,并粘贴到Anaconda安装目录下,也就是python36.dll所在的目录下,一般就是第一层目录。
4.准备就绪,然后打开你的powershell或cmd窗口,键入

pip install PyQt5 

等待,下载…安装…提示安装成功。

打开python交互式窗口,进行测试

from PyQt5 import QtCore

没有报错。哈哈,没有消息就是最好的消息^o^

注意!!

如果你出现类似下面的错误,那么问题就出在python安装包版本和你的电脑配置不匹配

from PyQt5 import QtCore 
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

这个错误是因为,我进入python.org之后点击默认的下载链接,没有想到是32位的,出现这个错误后,又重新去下载的64位版本,然后就成功咯!

猜你喜欢

转载自blog.csdn.net/qq_41556318/article/details/84980387