2017年12月14日 星期四

將 Python 程式碼打包為可執行檔

將 Python 程式碼打包為可執行檔
Version 1: December 4, 2017
Version 2: December 5, 2017

  最近正好要將一些以前寫的 Python 程式碼打包為可執行檔,這樣才能把程式拿到沒有安裝 Python 的電腦上執行。在請教 Google 之後,找到了3個目前最多人使用的方法:
  1. py2exe ( http://www.py2exe.org/ )
  2. cx_Freeze ( https://anthony-tuininga.github.io/cx_Freeze/ )
  3. PyInstaller ( http://www.pyinstaller.org/ )
其中 py2exe 只有支授到 Python 2.7 版,但是我使用的是 Python 3.6.3 版,所以我就跳過這個軟體不進行測試。所用的作業系統為 Windows 10 64-bit 家用版。以下是另外2個軟體的安裝及測試結果。


cx_Freeze
  1. 打開指令界面,輸入並執行以下指令安裝軟體
    python -m pip install cx_Freeze --upgrade
  2. 新增一個測試用的資料夾,我是在桌面上新增名為 "cx_Freeze" 的資料夾,把想要轉檔的 Python 程式碼複製到這個資料夾中,我的檔案為 "gcd.py"
  3. 進到安裝 Python 的資料夾中,將 "cxfreeze-quickstart" 檔案複製到測試用的資料夾中。路徑可能為
    (a) 安裝給所有使用者:"C:\Program Files\Python36\Scripts\"
    (b) 安裝給特定使用者:"C:\Users\[username]\AppData\Local\Programs\Python\Python36\Scripts\"
  4. 在指令界面中使用 cd 指令切換到測試用資料夾中,輸入並執行以下指令以產生轉檔用的 setup.py 檔
    python cxfreeze-quickstart
    依據畫面指示輸入適當的選項,執行完畢後會產生 setup.py
  5. 輸入並執行以下指令以完成轉檔
    python setup.py build
  6. 進入 "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
  1. 打開指令界面,輸入並執行以下指令安裝軟體
    python -m pip install pyinstaller
  2. 新增一個測試用的資料夾,我是在桌面上新增名為 "pyinstaller" 的資料夾,把想要轉檔的 Python 程式碼複製到這個資料夾中,我的檔案為 "gcd.py"
  3. 在指令界面中使用 cd 指令切換到測試用資料夾中,輸入並執行以下指令以完成轉檔
    pyinstaller -i [icon_file].ico -F gcd.py
    參數 -i [icon_file].ico 是以 [icon_file].ico 作為執行檔的圖示
    參數 -F 是在 dist 資料夾下產生一個獨立的可執行檔
    完整的指令說明請參考 https://pythonhosted.org/PyInstaller/usage.html
  4. 輸入並執行以下指令進入子資料夾並執行檔案
    cd dist
    gcd.exe
    我有把 gcd.exe 丟到另一台電腦上測試,電腦上沒有安裝 Python,作業系統是 Windows 7 旗艦版,但可以順利執行,如測試結果畫面截圖1,看來應該是成功了。
  5. 如果在轉檔時使用的是pyinstaller gcd.py會使用預設的選項參數 -D ,會在 build 資料夾中建立一個名為 gcd 的資料夾,裡面有轉出的 gcd.exe ,但在執行時出現錯誤訊息 "Error loading Python DLLl " ,只要進到安裝 Python 的資料夾中把 python36.dll 複製到這個資料夾中就可以正常執行 gcd.exe 檔。但是這個執行檔需要依賴許多其它檔案才能執行,不建議使用。

 Pyinstaller 測試結果畫面截圖1




Pyinstaller 測試結果畫面截圖2


結論
  1. py2exe:支援版本較舊,放棄。
  2. cx_Freeze:目前有 bug,觀望中。
  3. PyInstaller:成功。

沒有留言:

張貼留言