詳解pyinstaller生成exe的閃退問題解決方案
簡單模塊問題
如果在 pyinstaller project.py
的過程中,出現(xiàn):
No module named 'xxx'
那就 pip install xxx
就行,比如:
$ pip install wxPython pypiwin32 tornado
這個(gè) pip 對應(yīng)于項(xiàng)目的虛擬環(huán)境。
其中 wxPython 對應(yīng) No module named 'wx'
其中 pypiwin32 對應(yīng) No module named 'win32com'
還有個(gè)老生常談的小問題,提一下,避免萌新看的一頭霧水,比如有些包有別名,比如你并不能通過 pip install wx
來解決 No module named 'wx'
的問題。這需要一些經(jīng)驗(yàn),沒經(jīng)驗(yàn)的這些去搜索引擎搜索搜索就知道了,基本解決方法都是 pip install ...
,其中 ...
是這個(gè)模塊的真名。
全網(wǎng)唯一答案系列
以上都是簡單的問題,如果不會出現(xiàn) No module named xxx
的問題,就不用關(guān)心 pip install
了。
再遇到閃退等問題可以加上命令參數(shù) -D
:
pyinstaller -D project.py
,表示我們打包成一個(gè)文件夾,而不僅僅是個(gè) exe 文件,當(dāng)然這個(gè)項(xiàng)目文件夾在 dist 下面。
在每次重新打包之前,務(wù)必刪除項(xiàng)目中的 build
、dist
目錄。
這時(shí)候還會碰到一些棘手的問題,比如:
看最后的異常提示是 PyInstallerImportError 錯(cuò)誤,可以看到 sklearn 下面缺少 .libs/vcomp140.dll
文件,這是因?yàn)?pyinstaller 的執(zhí)行過程中,沒有把虛擬環(huán)境(你的項(xiàng)目開發(fā)環(huán)境中 Lib/site-packages/
內(nèi)的包)中的該依賴文件(vcomp140.dll
)打包進(jìn)來,這時(shí)候去原本我們的虛擬環(huán)境中找到這個(gè)文件,復(fù)制出來,粘貼進(jìn)我們這個(gè)打包生成的文件夾內(nèi)對印的 ./sklearn
目錄下的對應(yīng)位置,但是我們看到這個(gè)目錄下面居然沒有 .libs
文件夾,那就在這里(./sklearn
)創(chuàng)建一個(gè),然后把那個(gè)缺的依賴文件(vcomp140.dll
)復(fù)制進(jìn)來就行。
可能看的會有點(diǎn)暈,這里需要耐心點(diǎn)看,為了避免文字過多產(chǎn)生的表達(dá)歧義,再強(qiáng)調(diào)一下思路:「把生成的項(xiàng)目文件夾中缺失的依賴文件,如 dll
文件;從開發(fā)環(huán)境中的包里找到它,并復(fù)制進(jìn)來。」
打包調(diào)試的時(shí)候需要注意不要隱藏控制臺,不然拿不到錯(cuò)誤信息,無法進(jìn)行下一步 debug 操作。
我們可以看到這個(gè)問題被解決了,但是會有新的問題,基本都是 sklearn 的問題,這里只是枚舉我發(fā)生的問題,如果你寫的是別的項(xiàng)目,庫依賴也很嚴(yán)重,也會有這些問題,可能不是 sklearn,總之肯定是某個(gè)包缺失依賴文件或模塊文件的問題。
現(xiàn)在來看看新的報(bào)錯(cuò)信息:
這個(gè)問題基本全網(wǎng)的答案都是諸如修改 project.spec
文件中的 a=Analysis(...)
選項(xiàng)的 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
如果你用這個(gè)方法解決不了,那就嘗試把缺失的模塊從開發(fā)環(huán)境中的 site-packages 里復(fù)制出來粘貼進(jìn)我們生成的 ./dist/project/
里面對應(yīng)的模塊所在位置(如果沒有找到對應(yīng)的路徑,不存在這個(gè)文件夾之類的,就如以上說的建一個(gè) .libs/
文件夾一樣創(chuàng)建一個(gè)。)
比如我的生成項(xiàng)目文件夾位于:
C:\Users\Galois\Documents\project\dist\project
當(dāng)然,我們需要的項(xiàng)目可執(zhí)行文件 exe 也在這個(gè)目錄下。
接下來的操作基本就是對這個(gè)目錄里面進(jìn)行粘貼缺失的模塊,根據(jù)異常報(bào)錯(cuò)信息,比如我們剛才得到的報(bào)錯(cuò)是:
ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'
現(xiàn)在我們進(jìn)入兩個(gè)地方:
生成的項(xiàng)目中的目錄:
C:\Users\Galois\Documents\project\dist\project\sklearn\utils
開發(fā)環(huán)境中的目錄(由于我不知道各位開發(fā)環(huán)境怎樣,這里就直接用開發(fā)環(huán)境的相對目錄來說明路徑):
yourenv/Lib/site-packages/skearn/utils/
在這個(gè)開發(fā)環(huán)境中的這個(gè)路徑我們會看到一些 pyd
文件,我們的操作諸如這張圖:
我們可以看到報(bào)錯(cuò)中的缺失模塊 ‘sklearn.utils._cython_blas' 的模塊文件在這里其實(shí)被命名成了 _cython_blas.cp37-win_amd64.pyd
,就是它了。
復(fù)制進(jìn)來后,我們再雙擊生成的文件夾下的可執(zhí)行文件 ./project/dist/project/project.exe
,捕捉一下新的錯(cuò)誤,一直這樣捕捉錯(cuò)誤,然后復(fù)制粘貼操作修復(fù)錯(cuò)誤,如果沒錯(cuò)誤就成功了。除非你還有其它類型的錯(cuò)誤。
我們又看到了新的報(bào)錯(cuò):
同樣的方法,解決這個(gè)同樣類型的錯(cuò)誤,思路「打開開發(fā)環(huán)境對應(yīng)的目錄找到生成項(xiàng)目目錄中缺失的 pyd
文件復(fù)制進(jìn)生成項(xiàng)目目錄中對應(yīng)的位置」。
可能有人一遍有點(diǎn)懵,那我就不省略了,再重復(fù)下修復(fù)這個(gè)錯(cuò)誤的示意圖:
接下來的 debug 就不詳細(xì)展示了,步驟思路一摸一樣,直到讓可執(zhí)行文件不再缺失模塊為止,就成功了,最后運(yùn)行下生成的可執(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()的實(shí)現(xiàn)代碼
本文主要介紹了python內(nèi)置函數(shù)globals()的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09淺談python 導(dǎo)入模塊和解決文件句柄找不到問題
今天小編就為大家分享一篇淺談python 導(dǎo)入模塊和解決文件句柄找不到問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12用Python實(shí)現(xiàn)一個(gè)簡單的能夠發(fā)送帶附件的郵件程序的教程
這篇文章主要介紹了用Python實(shí)現(xiàn)一個(gè)簡單的能夠發(fā)送帶附件的郵件程序的教程,用MIMEApplication模塊來發(fā)送各種類型的文件,需要的朋友可以參考下2015-04-04Python實(shí)現(xiàn)快速排序和插入排序算法及自定義排序的示例
這篇文章主要介紹了Python實(shí)現(xiàn)快速排序和插入排序算法及自定義排序的示例,自定義排序用到了Python的sort和sorted函數(shù),需要的朋友可以參考下2016-02-02Python Dict找出value大于某值或key大于某值的所有項(xiàng)方式
這篇文章主要介紹了Python Dict找出value大于某值或key大于某值的所有項(xiàng)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06