cx_Freeze:轉換Python程式為執行檔的套件

在microsoft windows 的作業系統中,使用者最常執行的通常是執行檔(*.exe)。而python和R 是這幾年熱門的程式語言,它們相較於C語言的好處是套件(package)多,易於快速開發。不過,要讓Python開發好的應用程式給一般使用者使用,須要先行安裝Python執行環境。雖然python環境檔案小、下載快且安裝夠簡單。可是python應用程式import的套件需要另外手動安裝,這一個手動的工作對於一般使用者就可能有因難了(文字模式指令)。一種變通的方式就是把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檔案中。

setup script

必須建立setup腳本來使用build。本文有兩種範例分別是視窗和console應用程式,習慣上稱為setup.py,雖然可取任何名稱。看起來像這樣:
以下是視窗應用程式(以下取自cx_Freeze github)

# -*- coding: utf-8 -*-

# A very simple setup script to create a single executable
#
# hello.py is a very simple ‘Hello, world’ type script which also displays the
# environment in which the script runs
#
# Run the build process by running the command ‘python setup.py build’
#
# If everything works well you should find a subdirectory in the build
# subdirectory that contains the files needed to run the script without Python

from cx_Freeze import setup, Executable

executables = [
Executable(‘hello.py’)
]

setup(name=’hello’,
version=’0.1′,
description=’Sample cx_Freeze script’,
executables=executables
)

以下是hello.py應用程式

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
import sys
from sys import stdout

stdout.write(‘Hello from cx_Freeze\n’)
stdout.write(‘The current date is %s\n\n’ %
datetime.today().strftime(‘%B %d, %Y %H:%M:%S’))

stdout.write(‘Executable: %r\n’ % sys.executable)
stdout.write(‘Prefix: %r\n’ % sys.prefix)
stdout.write(‘Default encoding: %r\n’ % sys.getdefaultencoding())
stdout.write(‘File system encoding: %r\n\n’ % sys.getfilesystemencoding())

stdout.write(‘ARGUMENTS:\n’)
for a in sys.argv:
stdout.write(‘%s\n’ % a)
stdout.write(‘\n’)

stdout.write(‘PATH:\n’)
for p in sys.path:
stdout.write(‘%s\n’ % p)
stdout.write(‘\n’)

這腳本主要是在設置setup()中的參數值,所以先看setup()中的東西,前面的變數最後都是用來填到這邊的參數。

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

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

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

執行這腳本:

python setup.py build

這會建立稱為build的子目錄,其中有以exe開頭與exe.win-amd64-3.6所用平台識別字做結尾的子目錄。這可做多平台組建而不產生衝突。

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

cx_Freeze版本是5.1.1,

其他類似工具

  • Freeze:Python本身所提供在Unix上的Freeze功能。
  • PyInstaller:也支援多平台,稍複雜,以後有機會再來談這個。

另外還有py2exe, py2app, bbFreeze,但要注意有的稍舊或沒那麼好用,或沒人維護。

參考

無迴響

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

電腦主機相關
Dell 開機與LED燈號按鈕說明

黑色 = 電源負極/接地 ,黃色 = 電源正極,短路黑色和黃色超過4秒可以關機,約1秒可以重開機。 …

電腦主機相關
python轉換成執行檔錯誤1 api-ms-win-crt-runtime-l1-1-0.dll 錯誤2VCRUNTIME140.dll

1. 下載 KB2999226 以 Windows 7 64位元為例,下載的檔案為 Windows6 …

教職員資訊設備
取回多網卡 IPV6, IPV4 的 MAC

  以下參考至為 http://wiki.alarmchang.com/index.php …