Python 進階必學庫:Pyinstaller 使用詳解

Python 腳本語言 Windows 程序員 UNIX 編程python新視野 2019-06-29

HackPython 致力於有趣有價值的編程教學


Python 進階必學庫:Pyinstaller 使用詳解


簡介

當我們希望將自己編寫好的程序傳送給他人使用時,如果對方沒有安裝 Python 環境就無法使用程序了,我們難以讓每個使用者都安裝 Python 環境,是否可以在不必安裝 Python 環境的前提下使用 Python 程序呢?

可以使用 Pyinstaller 將程序打包,然後再分享給其他人使用,他人使用只需雙擊運行打包好的程序。

可以通過 pip 來安裝,命令如下:

pip install pyinstaller

使用

pyinstaller 最重要的兩個參數就是 -F 與 -D 參數。

使用 - F 參數, pyinstaller 會將 python 程序打包成單個可執行文件。

使用 - D 參數, pyinstaller 會將 python 程序打包成一個文件夾,運行程序時,需要進入該文件夾,點擊運行相應的可執行程序。

為了美觀,還可以通過 - i 參數指定打包程序的圖標 (icon),但這個命令只能在 Windows 平臺下生效,此外還可以使用 - n 參數指定生成打包文件的名稱。

如果你使用了 PyQt5 或 tkinter 開發了界面,通常不會希望程序運行時彈出 cmd 命令行,此時就可以使用 - w 參數。

簡單總結一下:

-F:打包 Python 程序為單個可執行文件

-D:打包 Python 程序為一個文件夾

-i:生成圖標,只適用於 Windows 平臺

-n:指定打包後生成文件的名稱

-w:禁止命令行彈出

綜上所述,最常見的命令為:

pyinstaller 
-
i xxx
.
ico
-
n xxx
-
w
-
D xxx
.
py

-i 參數後必須接 .ico 結尾的圖標文件

-D 或 -F 後必須接 python 程序的入庫程序,常見情況為 main.py

對應依賴比較多的程序,建議使用 -D, -F 更適合單文件的 py 腳本。

簡單原理

打包時,pyinstaller 此時會生成相應的 spec 文件,大體流程如下:

1、在腳本目錄生成 xxx.spec 文件 (取決於 -n 參數,沒傳,則與 xxx.py 同名為 xxx);

2、創建一個 build 目錄;

3、寫入一些日誌文件和中間流程文件到 build 目錄;

4、創建 dist 目錄;

5、生成可執行文件或文件夾到 dist 目錄;

Python 進階必學庫:Pyinstaller 使用詳解

此時,進入 dist 目錄就可以看見自己的打包文件了。


Python 進階必學庫:Pyinstaller 使用詳解


擊 nameauto.exe 文件,效果如下:

效果如下:


Python 進階必學庫:Pyinstaller 使用詳解


這是一個利用 tkinter 構建的程序。

注意事項

Pyinstaller 是跨平臺的,但並不是指其生成應用是跨平臺的,而是 Pyinstaller 本身是跨平臺的,在 Windows 平臺下,可以打包出 exe 文件。

避免打包後,包文件過大

為了避免 Pyinstaller 打包後程序或文件夾過大,如:幾百 KB 的程序打包後編程 500M 左右的程序,在引用包時,儘量使用 from ... import ... 語句,這是因為 Pyinstaller 打包的路徑其實是將 python 解釋器以及項目中使用的庫直接複製過來,所以如果你沒事就別 import... ,那麼 Pyinstaller 會將整個模塊複製過去,此時打出來的包就會很大。

考慮路徑問題

使用 python 時,要養成使用 os.path.join 的習慣,這不僅可以避免跨平臺的路徑坑 (windows 路徑表達與類 Unix 是不同),又可以在打包時不會出現相對路徑的問題,很多 python 程序員編寫路徑喜歡使用 + 號來鏈接路徑,這會增加項目的維護成本

pyinstaller 打包的項目遇到路徑都使用 os.path.join 則可

外部數據問題

雖然在上節中,提及了使用外部數據時,可以自定義 spec 文件中的 datas 字段,但我更常用的做法是直接將數據複製過去,不去修改 datas。

比如我的項目中依賴 config 文件夾下的配置文件,執行將 config 文件夾整體直接複製到打包好的文件夾中則可

閃屏結束

如果是簡單的程序,可能會出現運行可執行程序後出現一閃而過的情況,這種情況下要麼是程序運行結束(比如直接打印的 helloWorld),要麼程序出現錯誤退出了。

這種情況要麼通過 input () 函數捕捉輸入自己主動結束程序,要麼就在 cmd 下運行 exe 文件,從而通過 cmd 看到效果

結尾

掌握了 Pyinstaller 後,你就可以將任意程序打包發送給他人了,最後歡迎學習 HackPython 的教學課程並感覺您的閱讀與支持。

相關推薦

推薦中...