HackPython 致力於有趣有價值的編程教學
簡介
當我們希望將自己編寫好的程序傳送給他人使用時,如果對方沒有安裝 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 目錄;
此時,進入 dist 目錄就可以看見自己的打包文件了。
擊 nameauto.exe 文件,效果如下:
效果如下:
這是一個利用 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 的教學課程並感覺您的閱讀與支持。