將 Python 程式碼打包為可執行檔
Version 1: December 4, 2017
Version 2: December 5, 2017
最近正好要將一些以前寫的 Python 程式碼打包為可執行檔,這樣才能把程式拿到沒有安裝 Python 的電腦上執行。在請教 Google 之後,找到了3個目前最多人使用的方法:
- py2exe ( http://www.py2exe.org/ )
- cx_Freeze ( https://anthony-tuininga.github.io/cx_Freeze/ )
- PyInstaller ( http://www.pyinstaller.org/ )
cx_Freeze
- 打開指令界面,輸入並執行以下指令安裝軟體
python -m pip install cx_Freeze --upgrade - 新增一個測試用的資料夾,我是在桌面上新增名為 "cx_Freeze" 的資料夾,把想要轉檔的 Python 程式碼複製到這個資料夾中,我的檔案為 "gcd.py"
- 進到安裝 Python 的資料夾中,將 "cxfreeze-quickstart" 檔案複製到測試用的資料夾中。路徑可能為
(a) 安裝給所有使用者:"C:\Program Files\Python36\Scripts\"
(b) 安裝給特定使用者:"C:\Users\[username]\AppData\Local\Programs\Python\Python36\Scripts\" - 在指令界面中使用 cd 指令切換到測試用資料夾中,輸入並執行以下指令以產生轉檔用的 setup.py 檔
python cxfreeze-quickstart
依據畫面指示輸入適當的選項,執行完畢後會產生 setup.py - 輸入並執行以下指令以完成轉檔
python setup.py build - 進入 "build\exe.win-amd64-3.6\" 找到輸出的 .exe 檔,但在執行時出現以下的錯誤訊息 " ModuleNotFoundError: No module named 'codecs' " ,再度請教 Google 之後發現這似乎是 cx_Freeze 的 bug,已經有人向開發者回報問題,詳細情形可以參考 https://github.com/anthony-tuininga/cx_Freeze/issues/325
Pyinstaller
- 打開指令界面,輸入並執行以下指令安裝軟體
python -m pip install pyinstaller - 新增一個測試用的資料夾,我是在桌面上新增名為 "pyinstaller" 的資料夾,把想要轉檔的 Python 程式碼複製到這個資料夾中,我的檔案為 "gcd.py"
- 在指令界面中使用 cd 指令切換到測試用資料夾中,輸入並執行以下指令以完成轉檔
pyinstaller -i [icon_file].ico -F gcd.py
參數 -i [icon_file].ico 是以 [icon_file].ico 作為執行檔的圖示
參數 -F 是在 dist 資料夾下產生一個獨立的可執行檔
完整的指令說明請參考 https://pythonhosted.org/PyInstaller/usage.html - 輸入並執行以下指令進入子資料夾並執行檔案
cd dist
gcd.exe
我有把 gcd.exe 丟到另一台電腦上測試,電腦上沒有安裝 Python,作業系統是 Windows 7 旗艦版,但可以順利執行,如測試結果畫面截圖1,看來應該是成功了。 - 如果在轉檔時使用的是pyinstaller gcd.py會使用預設的選項參數 -D ,會在 build 資料夾中建立一個名為 gcd 的資料夾,裡面有轉出的 gcd.exe ,但在執行時出現錯誤訊息 "Error loading Python DLLl " ,只要進到安裝 Python 的資料夾中把 python36.dll 複製到這個資料夾中就可以正常執行 gcd.exe 檔。但是這個執行檔需要依賴許多其它檔案才能執行,不建議使用。
Pyinstaller 測試結果畫面截圖2
結論
- py2exe:支援版本較舊,放棄。
- cx_Freeze:目前有 bug,觀望中。
- PyInstaller:成功。
沒有留言:
張貼留言