跳到內容

打包成執行檔

你寫好的 .py 檔,別人要執行得先裝 Python 才行。這個專題用 PyInstaller 把前面做的猜數字遊戲和 GUI 計算機打包成執行檔(Windows 上是 .exe),這樣就能直接傳給別人,對方點兩下就能開,不必裝 Python。

如果你的專案是用 uv 管理的,用 uv add:

Terminal window
uv add pyinstaller

沒有用 uv 的話,用 pip 也可以:

Terminal window
pip install pyinstaller

先拿猜數字遊戲練手。把它存成 guess_number.py,在它所在的資料夾執行:

Terminal window
pyinstaller guess_number.py

打包完成後,執行檔會出現在新產生的 dist/guess_number/ 資料夾裡,旁邊還有一大堆 .dll、.pyd 之類的檔案。這些都是程式執行時需要的東西,要整個資料夾一起給人,只複製 .exe 出去是跑不起來的。

一個資料夾傳來傳去不方便,加上 --onefile 就會把全部東西壓成單一執行檔:

Terminal window
pyinstaller --onefile guess_number.py

這次 dist/ 裡只有一個 guess_number.exe,把它傳給別人就能玩了。打開會跳出黑色的終端機視窗,因為猜數字是用 input() 和 print() 跟人互動的。

把上一個專題的程式存成 gui_calc.py,一樣用 --onefile 打包:

Terminal window
pyinstaller --onefile gui_calc.py

執行看看,你會發現計算機視窗後面多了一個黑色的終端機視窗。GUI 程式不需要它,加上 --noconsole 把它藏起來:

Terminal window
pyinstaller --onefile --noconsole gui_calc.py

--windowed 和 --noconsole 是同一個選項的兩個名字,看到哪個都一樣。注意猜數字不能加這個選項,它沒有終端機就沒地方讀輸入、印文字了。

想自訂執行檔的名字,加上 --name:

Terminal window
pyinstaller --onefile --noconsole --name 我的計算機 gui_calc.py

打包完,資料夾裡會多出幾樣東西:

  • dist/:你要的執行檔就在這裡,要分享給別人的就是這個檔(或這個資料夾)。
  • build/:打包過程的暫存檔,可以不用管它。
  • 一個 .spec 檔:這次打包的設定,之後要重新打包可以沿用。
  • 防毒軟體誤判:PyInstaller 打包出來的執行檔,有時會被防毒軟體當成可疑程式。這是這類工具常見的誤判,不是你的程式有問題。
  • 檔案很大:因為它把 Python 直譯器和用到的套件全部包進去了,所以即使是很短的程式,打包出來也可能有好幾十 MB,這是正常的。
  • --onefile 開得比較慢:單一執行檔每次啟動都要先把裡面的東西解壓縮到暫存資料夾,所以會比資料夾版慢個一兩秒,這也是正常的。
  • 少了資料檔:如果你的程式會讀圖片、資料檔之類的東西,這些預設不會被打包進去,需要額外設定。這兩個專題都用不到。

v0.9.1 (c924b5b)