ModuleNotFoundError: No moduel named 'PyQt5.sip'
ModuleNotFoundError: No moduel named 'PySide2.QtXml'
Pyinstaller打包成exe馍资,報(bào)錯(cuò)ModuleNotFoundError融涣。首先檢查下報(bào)錯(cuò)信息里的ModuleNotFoundError是否是自己明確import的包文件膘婶?如果不是,重新打包程序,并使用--hidden-import ModuleName 命令丟棄相應(yīng)報(bào)錯(cuò)的包继薛。
pyinstaller -F project_pyqt.py --hidden-import PyQt5.sip
pyinstaller -F project_pyqt.py --hidden-import PySide2.QtXml
打包完成后運(yùn)行exe程序,如果沒有報(bào)錯(cuò)愈捅,測(cè)試下相關(guān)功能是否都正常運(yùn)作遏考,如果沒問題就萬事大吉了。過于深入的內(nèi)因和原理就不要深究了蓝谨。別問灌具,問就是不會(huì)~~~
對(duì)于要靠我這篇文章來解決這個(gè)問題的同學(xué)們,要對(duì)自身是個(gè)拿來主義縫合怪的身份有清醒認(rèn)知譬巫,功能看起來沒問題拿著用就完了~~
背景故事
一直用Python處理數(shù)據(jù)和繪圖咖楣,敲命令行就完事了。但是最近開始給其他同事寫代碼優(yōu)化工作效率缕题,被迫開始擼界面截歉。最開始用tkinter擼,簡(jiǎn)易也能用烟零,但是窗口的零件一旦多起來從布局到屬性設(shè)置一行一行擼過去就實(shí)在是太愁人了瘪松,而且丑咸作。
嘗試入坑PyQt5,designer直接把體驗(yàn)直線拉滿宵睦,香得起飛记罚。并且掌握了UI和Main分開的技能。
pip install PyQt5 pyqt5-tools --user
在Designer里擼完界面以后壳嚎,將.ui格式的文件使用代碼轉(zhuǎn)換成.py文件桐智。
pyuic5 xxxx.ui -o xxxx.py
再寫一個(gè)Main.py程序調(diào)用,寫完之后開開心心打包運(yùn)行exe烟馅,發(fā)現(xiàn)這個(gè)報(bào)錯(cuò)提示:
ModuleNotFoundError: No moduel named 'PyQt5.sip'
各種網(wǎng)上查找说庭,有如下兩種明確的建議方式:
1.關(guān)于特定PyQt5.sip和PyQt5的版本進(jìn)行匹配的方案;<不成功>
2.建議缺什么包就直接在原代碼中import的方案郑趁;<不成功>
各種檢索和嘗試后刊驴,對(duì)PyQt5絕望,認(rèn)為這個(gè)可能就是PyQt5的坑寡润,于是放棄exe捆憎,直接給各個(gè)有需要的同事直接裝了python然后移植包文件。
收工大吉梭纹?No.
接著發(fā)現(xiàn)產(chǎn)線有一臺(tái)電腦是一臺(tái)老舊機(jī)器躲惰,在裝Python的時(shí)候會(huì)報(bào)一個(gè)某物理地址被占用的特殊錯(cuò)誤。又是一頓檢索和折騰变抽,無果础拨,絕望放棄該電腦。
繼續(xù)瀏覽PyQt5相關(guān)的內(nèi)容和歷史瞬沦,無意中發(fā)現(xiàn)Qt在python方向上有兩路分支太伊,PyQt5是一個(gè)雇锡,還有一個(gè)是PySide2逛钻,看了一眼各種介紹,發(fā)現(xiàn)相似度極高锰提∈锒唬基本只需要修改導(dǎo)入的包文件名就可以實(shí)現(xiàn)主函數(shù)的完全復(fù)用。然后抱著PySide2打包說不定不會(huì)報(bào)錯(cuò)的僥幸心理下載了立肘。先試了個(gè)小程序边坤,打包exe居然真的成功了,激動(dòng)谅年。把原本的代碼里的UI和Main部分做了徹底的重構(gòu)和剝離茧痒,Main函數(shù)就修改Import的頭文件,把.ui文件重新轉(zhuǎn)碼成PySide2格式的.py文件.
pyside2-uic xxxx.ui -o xxxx.py
于是開開心心打包運(yùn)行融蹂,報(bào)錯(cuò):
ModuleNotFoundError: No moduel named 'PySide2.QtXml'
原地懵逼~~~仰天長(zhǎng)嘯~~棄療收工旺订?No.
繼續(xù)檢索PySide2.QtXml這個(gè)模塊的時(shí)候看到一篇CSDN的博客弄企,提到了這么一句命令--hidden-import ModuleName,頓時(shí)覺得世界又有了希望区拳。果斷cmd打包執(zhí)行之拘领,成了。
pyinstaller -F project_pyqt.py --hidden-import PySide2.QtXml
今天早上又想了想樱调,會(huì)不會(huì)PyQt5的那個(gè)PyQt5.sip的問題也能這么解決约素? 打包結(jié)束運(yùn)行居然就這么成功了~~。
pyinstaller -F project_pyqt.py --hidden-import PyQt5.sip
今天去檢索了半天昨晚的歷史瀏覽記錄笆凌,居然愣是沒找出來這個(gè)大恩人的CSDN原博文來~然后發(fā)現(xiàn)github.com/pyinstaller原頁面居然就有這個(gè)issue圣猎,答案里提到了--hidden-import ModuleName的建議。百度對(duì)中文的支持很好乞而,但是混雜英文回答的時(shí)候檢索權(quán)重真的是迷~~