Skip to content

[Python] 使用 PyInstaller 套件將程式打包成 exe 執行檔

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

Tags:

Leave a Reply