這類把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_exe與cx_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:也支援多平台,稍複雜,以後有機會再來談這個。
沒有留言:
張貼留言