詳解pyinstaller生成exe的閃退問題解決方案
簡單模塊問題
如果在 pyinstaller project.py 的過程中,出現(xiàn):
No module named 'xxx'
那就 pip install xxx 就行,比如:
$ pip install wxPython pypiwin32 tornado
這個 pip 對應于項目的虛擬環(huán)境。
其中 wxPython 對應 No module named 'wx'
其中 pypiwin32 對應 No module named 'win32com'
還有個老生常談的小問題,提一下,避免萌新看的一頭霧水,比如有些包有別名,比如你并不能通過 pip install wx 來解決 No module named 'wx' 的問題。這需要一些經(jīng)驗,沒經(jīng)驗的這些去搜索引擎搜索搜索就知道了,基本解決方法都是 pip install ...,其中 ... 是這個模塊的真名。
全網(wǎng)唯一答案系列
以上都是簡單的問題,如果不會出現(xiàn) No module named xxx 的問題,就不用關(guān)心 pip install 了。
再遇到閃退等問題可以加上命令參數(shù) -D:
pyinstaller -D project.py,表示我們打包成一個文件夾,而不僅僅是個 exe 文件,當然這個項目文件夾在 dist 下面。
在每次重新打包之前,務必刪除項目中的 build、dist 目錄。
這時候還會碰到一些棘手的問題,比如:

看最后的異常提示是 PyInstallerImportError 錯誤,可以看到 sklearn 下面缺少 .libs/vcomp140.dll 文件,這是因為 pyinstaller 的執(zhí)行過程中,沒有把虛擬環(huán)境(你的項目開發(fā)環(huán)境中 Lib/site-packages/ 內(nèi)的包)中的該依賴文件(vcomp140.dll)打包進來,這時候去原本我們的虛擬環(huán)境中找到這個文件,復制出來,粘貼進我們這個打包生成的文件夾內(nèi)對印的 ./sklearn 目錄下的對應位置,但是我們看到這個目錄下面居然沒有 .libs 文件夾,那就在這里(./sklearn)創(chuàng)建一個,然后把那個缺的依賴文件(vcomp140.dll)復制進來就行。
可能看的會有點暈,這里需要耐心點看,為了避免文字過多產(chǎn)生的表達歧義,再強調(diào)一下思路:「把生成的項目文件夾中缺失的依賴文件,如 dll 文件;從開發(fā)環(huán)境中的包里找到它,并復制進來?!?/p>
打包調(diào)試的時候需要注意不要隱藏控制臺,不然拿不到錯誤信息,無法進行下一步 debug 操作。
我們可以看到這個問題被解決了,但是會有新的問題,基本都是 sklearn 的問題,這里只是枚舉我發(fā)生的問題,如果你寫的是別的項目,庫依賴也很嚴重,也會有這些問題,可能不是 sklearn,總之肯定是某個包缺失依賴文件或模塊文件的問題。
現(xiàn)在來看看新的報錯信息:

這個問題基本全網(wǎng)的答案都是諸如修改 project.spec 文件中的 a=Analysis(...) 選項的 hiddenimports 配置:
hiddenimports=['cython', 'sklearn', 'sklearn.utils._cython_blas'],
然后刪除 build、dist 后執(zhí)行:
$ pyinstaller -D project.spec
或者是直接給 pyinstaller 命令加參數(shù),比如這樣:
$ pyinstaller -F -w --hidden-import='sklearn.utils._cython_blas' --hidden-import='sklearn.neighbors.typedefs' --hidden-import='sklearn.neighbors.quad_tree' --hidden-import='sklearn.tree' --hidden-import='sklearn.tree._utils' project.py
如果你用這個方法解決不了,那就嘗試把缺失的模塊從開發(fā)環(huán)境中的 site-packages 里復制出來粘貼進我們生成的 ./dist/project/ 里面對應的模塊所在位置(如果沒有找到對應的路徑,不存在這個文件夾之類的,就如以上說的建一個 .libs/ 文件夾一樣創(chuàng)建一個。)
比如我的生成項目文件夾位于:
C:\Users\Galois\Documents\project\dist\project

當然,我們需要的項目可執(zhí)行文件 exe 也在這個目錄下。
接下來的操作基本就是對這個目錄里面進行粘貼缺失的模塊,根據(jù)異常報錯信息,比如我們剛才得到的報錯是:
ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'
現(xiàn)在我們進入兩個地方:
生成的項目中的目錄:
C:\Users\Galois\Documents\project\dist\project\sklearn\utils
開發(fā)環(huán)境中的目錄(由于我不知道各位開發(fā)環(huán)境怎樣,這里就直接用開發(fā)環(huán)境的相對目錄來說明路徑):
yourenv/Lib/site-packages/skearn/utils/
在這個開發(fā)環(huán)境中的這個路徑我們會看到一些 pyd 文件,我們的操作諸如這張圖:

我們可以看到報錯中的缺失模塊 ‘sklearn.utils._cython_blas' 的模塊文件在這里其實被命名成了 _cython_blas.cp37-win_amd64.pyd,就是它了。
復制進來后,我們再雙擊生成的文件夾下的可執(zhí)行文件 ./project/dist/project/project.exe,捕捉一下新的錯誤,一直這樣捕捉錯誤,然后復制粘貼操作修復錯誤,如果沒錯誤就成功了。除非你還有其它類型的錯誤。
我們又看到了新的報錯:

同樣的方法,解決這個同樣類型的錯誤,思路「打開開發(fā)環(huán)境對應的目錄找到生成項目目錄中缺失的 pyd 文件復制進生成項目目錄中對應的位置」。
可能有人一遍有點懵,那我就不省略了,再重復下修復這個錯誤的示意圖:

接下來的 debug 就不詳細展示了,步驟思路一摸一樣,直到讓可執(zhí)行文件不再缺失模塊為止,就成功了,最后運行下生成的可執(zhí)行文件 ./dist/project/project.exe:

這就成功了。
到此這篇關(guān)于詳解pyinstaller生成exe的閃退問題解決方案的文章就介紹到這了,更多相關(guān)pyinstaller生成exe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python內(nèi)置函數(shù)globals()的實現(xiàn)代碼
本文主要介紹了python內(nèi)置函數(shù)globals()的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
用Python實現(xiàn)一個簡單的能夠發(fā)送帶附件的郵件程序的教程
這篇文章主要介紹了用Python實現(xiàn)一個簡單的能夠發(fā)送帶附件的郵件程序的教程,用MIMEApplication模塊來發(fā)送各種類型的文件,需要的朋友可以參考下2015-04-04
Python實現(xiàn)快速排序和插入排序算法及自定義排序的示例
這篇文章主要介紹了Python實現(xiàn)快速排序和插入排序算法及自定義排序的示例,自定義排序用到了Python的sort和sorted函數(shù),需要的朋友可以參考下2016-02-02
Python Dict找出value大于某值或key大于某值的所有項方式
這篇文章主要介紹了Python Dict找出value大于某值或key大于某值的所有項方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

