Last Updated on 2021-04-10 by Clay
PyInstaller 是一個相當方便的 Python 套件,主要目的是用於打包 Python 的 .py 檔成為 exe 執行檔。
這樣做的價值在於,我們可以很方便地發佈我們所寫的程式到那些電腦裡沒有安裝 Python 的人那邊。PyInstaller 會自動綁定你所需要的所有模組、套件,然後自動打包。(當然,這裡面的坑非常多,建議搭配 stackoverflow 以及 github 的問題討論,可以解決不少遇到的問題)
如果你想參考官方的教學文件,那你可以參考這裡: https://www.pyinstaller.org/
那麼以下,開始簡單介紹該怎麼使用 PyInstaller 這個套件來完成打包 Python 程式的工作吧!
使用方法
首先,假設我們有以下的程式需要打包:
# -*- coding: utf-8 -*- import jieba import time text = input('輸入要短詞的東西!') print(jieba.lcut(text)) time.sleep(5)
Output:
輸入要短詞的東西!
我們把要斷詞的東西放在後頭,就會自動斷詞了。
輸入要短詞的東西!今天天氣真好
Building prefix dict from the default dictionary …
Loading model from cache C:\Users\Clay\AppData\Local\Temp\jieba.cache
['今天', '天氣', '真好']
Loading model cost 0.603 seconds.
Prefix dict has been built succesfully.
Process finished with exit code 0
那麼,我們該如何將這個簡單的斷詞程式打包成 exe 執行檔呢?
我們在當前目錄打開 terminal,Windows 的話便是 cmd。首先我們如果沒有裝過 PyInstaller 輸入底下指令:
pip3 install pyinstaller
安裝好了以後,我們同樣使用 terminal 打包剛剛的 Python 檔。
pyinstaller -F test.py
順帶一題, pyinstaller 有許多的參數可以設定:
- -F 打包單份文件
- -D 打包多個文件
- -d 產生 debug 的可執行文件
- -w 產生視窗
- -p 設定導入的路徑,很常被用到的功能,通常都是特殊下載的套件需要指定路徑來匯入
- -n 可選擇產生的名字
執行之後,我們的資料夾底下應該會有 build、dist、.spec 等。兩個目錄、一份檔案。
build 資料夾可以先不管,可執行檔位於 dist 中。
這裡提醒一下,如果你雙擊產生的 exe 檔卻只是小黑窗一閃而過,強烈建議你開 terminal 來啟動檔案,這樣多半可以看到你的報錯訊息。
如果正常執行,恭喜你!因為有時候我也不知道它為什麼不會執行 XD 可以執行是好事啊!
如果不能執行,以我們的範例程式而言,多半是 Jieba 的路徑沒有抓到。你可以在剛剛下指令後頭加 -p Jieba 資料夾的路徑。同樣,也可以在 .spec 的檔案裡頭找到以下這行:
a = Analysis(['test.py'],
pathex=['C:\Users\Clay\PycharmProjects\jieba_test'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
我們可以在以下這行新增 Jieba 路徑。
pathex=['C:\Users\Clay\PycharmProjects\jieba_test'],
以 ',' 隔開,然後以 str 資料型態輸入路徑。
緊接著,編譯 spec 檔。
pyinstaller -F test.spec
這樣同樣可以打包成功我們的檔案!而且還設定好了 Jieba 資料夾的路徑!
那麼,簡單的教學就在此告一段落了。
報錯討論
如果你使用 PyQt5 有發生找不到 core 的情形,也許你可以參考這篇: [已解決] PyInstaller unable to find Qt5Core.dll