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