1. 程式人生 > >pyinstaller打包exe問題:AttributeError、setuptools、DLL和PyQt5

pyinstaller打包exe問題:AttributeError、setuptools、DLL和PyQt5

之前寫的一個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位版本,然後就成功咯!