(請先看置頂博文)本博打開方式,請詳讀_liO_Oil的博客-CSDN博客_怎么把androidstudio卸載干凈
最近用Python開發了一個可視化界面,開發過程如魚得水,幾乎沒有BUG出現(項目簡單)。但是在臨近交付時發現,打包這個項目有點令人發愁。不過,一切難題最終被我“斬于馬下”(踩過眾多坑的我,今天就給大家重現一下我是怎么掉進坑里的!)
為了方便大家閱讀,我先介紹打包過程,然后再介紹我出現的問題和打包心得:
一、打包
能看到這篇博問的同學想必是通過百度搜索pyinstaller如何打包Python項目、Python程序、Pyqt5程序進來的,那么我們就不多介紹pyinstaller這個打包程序了。在這次打包過程中,我使用的pyinstaller版本為4.0,而不是最新的4.1版本(實踐過程中覺得pyinstaller4.1版本有坑,天坑!)
第一步? 安裝pyinstaller 4.0
使用Terminal或者在Setting->Project Interpreter添加:
1、? ?Terminal方法:需要輸入的命令行如下所示
pip install pyinstaller==4.0
2、Setting->Project Interpreter中設置
第二步 拷貝主程序到項目文件的Lib路徑下
主程序就是指明整個項目是從哪開始運行的程序,尤其是包含下圖代碼的,那一定是主程序了(你自己寫的代碼,主程序是哪個py文件你還不知道?)。那么就有好奇寶寶問了,我自己的主程序在原來位置好好的,為什么還需要復制到項目文件的Lib路徑下?這是因為Lib文件下的site-packages里有我們的pyinstaller,我們在使用該工具時,得讓他找的到我們要打包的程序。如下圖所示,我已經把main_code.py復制到Lib文件夾里了。(是Lib文件夾,不是Lib、site-packages)如果你為自己的程序設計了圖標,同樣的道理,把圖標文件(****.ico)也要復制到Lib文件目錄下。
? ? ? ?? ?
?
第三步 在Pycharm的Terminal中執行打包命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
打開Pycharm的Terminal,并進入到lib目錄下,使用的命令為:“cd lib”,如下圖所示:
接下來,開始我們的打包,需要的打包命令有兩種,分別有不同的效果,建議大家按照我介紹的順序都用一下,先介紹第一種,其中有-D和-i選項,:
pyinstaller -D main_code.py -i cat.ico
-D:打包 Python 程序為一個文件夾
-i:生成圖標,只適用于 Windows 平臺(沒有圖標就不用加“-i cat.ico”)
? ? ? ?使用這個打包命令打包好的程序在運行時會出現“窗口控制臺”黑框,如下圖所示。如果你的代碼無法正常運行(在Pycharm里可以運行,不代表打包后的exe程序可以流暢運行),窗口控制臺就會出現錯誤提示,也相當于一個DeBug的過程。所以,在此我建議打包程序的同學,先運行這個命令,等到一切正常后,再使用第二類“命令”。值得注意的是,如果打包好的程序無法順利運行,這個黑框就會一閃而過,我們根本看不清錯誤提示。我也遇到了這個問題,我使用錄頻軟件,錄制了整個過程,放慢速度后才看清錯誤提示,最終解決了BUG。以下是打包命令從輸入到打包成功的Terminal截圖,由于項目路徑不同,所以僅供參考!打包完成后,有一些程序需要讀取的文件比如Excel文件、圖片等,一定要把這些文件全部復制到“dist\main_code”文件里。我打包好的exe程序位置是“\Lib\dist\main_code\main_code.exe”,所以我將程序所需要的文件都放在了和“main_code.exe”相同的目錄下。大家可以以我為例,對照著操作。對了,我使用的是相對路徑。另外,如果按照我介紹的步驟進行打包,就不要再參考其他的資料或者書籍了,防止不兼容。
第二種命令:
pyinstaller --noconsole -D main_code.py -i cat.ico
其中--noconsole就是取消“窗口控制臺”黑框的命令選項,這個命令是等到程序一切正常后才使用的。所以我先前就說了,一定要按照我介紹的順序打包兩次,這樣才可以保證打包的成功率。下圖是使用第二種命令打包成果的Terminal截圖。
同理,也需要將exe程序所需要的圖片、excel等文件復制到和exe同樣的目錄下。
二、踩過的坑
1、部分模塊版本高,無法兼容或自身存在BUG。
出現問題的模塊或包為:Pyqt5、pyinstaller、sumpy。在主程序開頭,我已將上述中的二者導入(pyinstaller是打包工具,不是環境),但是在運行時,總是報錯,其中就包含numpy1.19.4。如果你也出現與numpy相關的報錯信息并且環境恰好是1.19.4的版本,那么我建議你使用如下命令降低numpy版本。
先卸載原先的1.19.4版本,在Terminal里輸入以下命令:
pip uninstall numpy==1.19.4
隨后安裝低版本 1.19.3
pip install numpy==1.19.3
或者也可以在Pycharm的Setting里修改,用減號移除包,用加號增加所要的包。如下圖1、圖2所示,可進行包的增刪以及包版本的選擇。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 2
Pyqt5也出現了問題,我仿照numpy的處理方式降低了版本,打包程序就運行的順暢多了。pyinstaller也是同樣的道理。
2、自身代碼問題
我使用的編輯器是Pycharm,運行代碼時沒有任何問題,打包也打包成功了,就是在運行exe文件時提示“exit”沒有聲明。我反復觀察代碼,后來是發現代碼里有一處使用“exit”不規范導致的,更改后,重新打包,exe程序成功運行!所以就如我上面說的,編譯器不報錯,不代表打包成功后的程序能順利運行。
3、與程序相關的文件(如圖片、Excel文件等)
?上文也提到,在打包完成后,要把相關文件全部放入與可運行程序同一目錄文件夾下,如果你依賴的文件在打包之前就在一個文件夾A里,那么把A復制,粘貼到與exe程序同一文件夾“dist”內。與路徑相關的還有在編寫代碼時使用的是相對路徑還是絕對路徑,我這里使用的是相對路徑。
4、打包程序只需要打包主程序
打包主程序即可,打包軟件自動會把依賴的模塊或包打包進去,比如我在此次開發過程中用了Pyqt5。pyinstaller打包main_code.py時,自動將Pyqt5等模塊打包進去,無需我們一一指定。?
5、一條道走到黑
?在踩坑過程中,我試驗了百度、CSDN上能查到的各種方法,不同情況使用的命令不同,程序所需文件復制到的位置也不同,大腦一片混亂。我在打包過程中還在思索,就一個簡簡單單的打包過程為啥這么復雜,網上教程為何都不適用,但是功夫不負有心人,我最終打包成功!所以,大家千萬不要像我一樣(東拼西湊),靜下心來,把我這篇文章看完,一步一步去打包。打包成功了“收藏、關注、點贊、轉發”,打包不成功,你私信我,我盡量幫助你解決問題。
最后附上我使用Python模塊的版本搭配,希望對大家起到一個參考的作用。