天天看點

Pyinstaller - 你的“神”隊友

哈哈!今天是我在2023年釋出的第一篇文章呀!

這兩天,我在做一個爬蟲項目。因為我做好後準備給我的朋友看看,但我朋友沒有 Python 環境。是以,隻好想辦法把 .py 打包成 .exe 。

在網上搜了一下,發現目前相對主流的有 Pyinstaller 、 Py2exe 等。最終我選擇了 Pyinstaller 。

我是用的 PyCharm 。在“終端”輸入:

pip install pyinstaller
           
Pyinstaller - 你的“神”隊友

 即可安裝。

安裝完成後,你就可以開始打包了。最快速的打包方式便是這樣:

pyinstaller 檔案名.py
           

如果看到 “successfully” 一詞就代表打包“成功”了。

如此, Pyinstaller 就會在你的項目目錄下生成 build檔案夾 、 dist檔案夾 與一個 檔案名.spec。

Pyinstaller - 你的“神”隊友

其中, build檔案夾 存放的是打包時的臨時檔案,可以删除; dist檔案夾 下的檔案夾便是你打包出來的,其下的 檔案名.exe 是可執行的(注意!這裡不能單獨運作這個檔案,它是有依賴的!後文還會介紹其它方法!);而 檔案名.spec 是配置規範檔案,它說明了軟體包如何被配置、打了哪些更新檔、安裝哪些檔案、安裝到哪裡等等。

現在你就可以在檔案夾下運作 .exe 檔案了!

但是,在我們實際開發過程中,會有各種各樣的需求,這裡就需要配置參數了。

常見參數:

-c(預設) 顯示控制台(指令行視窗,即黑框框)
-w 不顯示控制台
-D(預設) 生成一個包含 .exe 檔案的目錄,所有依賴項和 .exe 檔案位于同一目錄下
-F 将所有依賴項打包為單獨的、無依賴的 .exe 檔案。
-i 指定應用圖示( .ico 檔案)
-n 指定生成的目錄、 .spec 檔案、 .exe 檔案的名字
-p 設定導入路徑

這裡說一下:建議大家在調試時都不要使用 -w 參數,這樣在看一些異常資訊時會更加友善;另外單檔案運作與目錄下運作相比速度更慢(不止慢一點),是以這裡要看個人情況去填寫參數; -p 參數是當你在程式中引入了某個包(通過 import ),那麼你就需要使用 “-p 引入的包的路徑”,如有多個路徑,則用分号分隔。

舉個例子。源檔案叫 main.py ,圖示為 ico.ico ,這是一個爬蟲程式,引入了 requests 包,需要控制台,程式名為 crawler ,追求速度,則輸入:

pyinstaller -p D:\demo\venv\Lib\site-packages\requests -n crawler -i ico.ico -c -D main.py
           

好的呢!現在你就可以發給你的好朋友了呢!

但是……我以我的親身經曆告訴大家:似乎并不行。

最開始,我選擇了打包為單檔案,但發現用 -p 參數導入了,但和沒導入一模一樣,都會報錯(這裡可能是我自己的問題)。于是,我改為了生成一個包含 .exe 檔案的目錄便解決了第一個問題。是以,我個人是比較推薦選擇生成一個包含 .exe 檔案的目錄的(使用 -D )。

弄好後,因為我自己的電腦有Python環境,以防萬一,我準備放到我們家老電腦上試試(我們家老電腦系統是 win7 / 32位 )。結果,打開程式後先是報錯:

無法啟動此程式,因為計算機中丢失 api-ms-win-core-path-|1-1-0.dll。嘗試重新安裝該程式以解決此問題。
           

然後爆出錯誤資訊,還沒看清就閃退了。

好吧我一臉懵啊!

對于閃退的問題,隻用打開 cmd 執行程式就能看到報錯資訊了。

但對于第一個問題,可以想辦法下載下傳這個動态庫,放在系統指定的位置,但這個并不能直接解決問題。還有三種方法:一是将源檔案在 32位 的系統上生成為 .exe 檔案,二是在 64位 系統上下載下傳 32位 的虛拟機進行生成,三是使用 32位 的 anaconda 。具體可參考關于python打包py檔案成exe檔案_星浩前進中的部落格-CSDN部落格_py打包成exe調用其他包需要調用其他csv。 而對于報錯資訊,如果按上述過程重新生成後還是存在,我也就無能為力了。

我之是以說Pyinstaller是“神”隊友,是因為它的操作較簡單,隻是各種各樣的坑有點多。但是其實隻要把出現這些坑的原因、解決方法搞清楚,那使用起來就是非常友善的!

祝大家元旦快樂!