創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2017年6月16日 星期五

cx_Freeze:打包Python程式的利器

若要把Python開發好的應用程式交到用戶端使用,通常要在用戶端安裝Python執行環境,以及所用到的package,這工作若交由一般使用者進行,可能會有些挑戰性。一種變通的方式就是把Python腳本轉成.exe執行檔,連同用到的Python執行環境與package一起打包好,交給使用者,使用者無須煩惱前述的安裝工作,只要會啟動這些執行檔即可。

這類把Python程式打包成執行檔的工具有幾種不同選擇,這裡只談其中之一的cx_Freeze,因為它使用上較為簡單,而且支援多種平台,本文的範例則是用在Windows平台。

cx_Freeze是一套腳本與模組,用來將Python腳本凍結(freeze)成執行檔,就像py2exe與py2app所做的。與這二者不同的是,cx_Freeze是跨平台且可在Python本身可運行的任何平台上運行。它需要Python 2.7或以上版本,且可用在Python 3。

cx_Freeze除了有可把腳本程式凍結成執行檔的功能,也有建立安裝程式的功能,但本文只談前者,因為後者有其他更進階的工具可以辦到。我自己的作法是使用cx_Freeze把程式凍結成執行檔後,再使用Inno Setup製作安裝程式。

安裝cx_Freeze

python -m pip install cx_Freeze --upgrade

使用cx_Freeze

有三種不同使用cx_Freeze的方式,本文採用建立distutils setup script的方式,在凍結程式時若需要額外選項,這很有用,因為可將其儲存在腳本中。執行cxfreeze-quickstart來產生簡單的setup script。

cx_Freeze通常產生一目錄包含你的程式的執行檔,還有執行程式所必須的共用函式庫(DLL或.so檔)。

執行檔用的Python模組儲存在一zip檔中。package預設是儲存在檔案系統,但也可以包含在zip檔案中。

distutils setup script

必須建立setup腳本來使用distutils。習慣上稱為setup.py,雖然可取任何名稱。看起來像這樣:

import sys

from cx_Freeze import setup, Executable

build_exe_options = {'icon': 'chkimg.ico', 'include_files': ['chkimg.ico', 'folder.gif'], 'packages':['lxml']}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

executable = Executable('chkimg.pyw', base=base)

setup(
        name = "chkimg",
        version = "0.2",
        description = "Check Image",
        options = {'build_exe': build_exe_options},
        executables = [executable])
這腳本主要是在設置setup()中的參數值,所以先看setup()中的東西,前面的變數最後都是用來填到這邊的參數。

這個例子中除了主要的腳本程式chkimg.pyw,還用到圖示與圖片檔,使用lxml,同時也用Tkinter做圖形界面。

設置參數的作法就如同把資料填入Python的資料型態字串、字典或列表一般。

至於怎麼填,填什麼,可查一下cx_Freeze說明文件的build_execx_Freeze.Executable小節。在cx_Freeze源碼的samples目錄下也有許多的範例。

執行這腳本:
python setup.py build
這會建立稱為build的子目錄,其中有以exe開頭與distutils所用平台識別字做結尾的子目錄。這可做多平台組建而不產生衝突。

其中就包含所凍結的執行檔與必要的Python執行環境,包含所用到的模組與package,以上面的例子而言,所產生的檔案如下圖所示:


這篇是由幾年前做的記錄所改寫,cx_Freeze也由當時的4.3.1改版到目前的5.0.2,雖然基本用法沒太大改變,但freeze的作法有變動,故上例若改用新版製作,結果會與上圖有所不同。

以上是較為簡單的使用,細節可看它的說明文件,篇幅不多,容易上手。

提醒一下,cx_Freeze沒有把所有產生的檔案打包成單一執行檔的功能,不過有其他工具可辦到,說明文件的FAQ有提到這點,FAQ中也提到幾個常見的問題。

其他類似工具

  • Freeze:Python本身所提供在Unix上的Freeze功能。
  • PyInstaller:也支援多平台,稍複雜,以後有機會再來談這個。
另外還有py2exe, py2app, bbFreeze,但要注意有的稍舊或沒那麼好用,或沒人維護。

參考


沒有留言:

張貼留言