返回文章列表

Python程式碼封裝

本文探討 Python 應用程式封裝技術,涵蓋 PyInstaller、cx_Freeze 和 py2app 等工具,並提供建立可執行 ZIP 檔案的技巧,以及 Linux 發行版套件的製作方法。同時,簡要介紹 Jupyter Notebook 的特性與安裝。

程式開發 Python

Python 應用程式封裝成可執行檔,能簡化佈署流程並保護原始碼。PyInstaller 支援跨平台封裝,透過 pip 安裝後,使用 pyinstaller script.py 指令即可建立可執行檔,並可透過 .spec 檔案自訂設定。cx_Freeze 同樣支援跨平台,需先以 pip 安裝,再修改 setup.py 設定封裝選項。py2app 則專注於 macOS 平台,使用 pip 安裝後,透過 py2appletsetup.py 進行封裝。除了封裝工具,Python 也支援建立可執行的 ZIP 檔案,只需包含 __main__.py 檔案,即可直接執行。更進一步,可結合 shebang 建立更便捷的可執行檔,或使用 zipapp 模組簡化流程。針對 Linux 發行版,可使用 bdist_rpm 建立 RPM 套件。最後,Jupyter Notebook 提供互動式程式碼執行環境,支援多種語言及豐富輸出格式,方便資料科學和教學應用,透過 pip 安裝即可使用。

封裝 Python 程式碼:PyInstaller、cx_Freeze 和 py2app 詳解

在開發 Python 應用程式時,將程式碼封裝成可執行檔案是一個重要的步驟。這不僅能簡化佈署流程,還能保護原始碼不被輕易檢視。本文將詳細介紹三種流暢的封裝工具:PyInstaller、cx_Freeze 和 py2app,並提供實用的使用和技術細節。

PyInstaller:跨平台的封裝利器

PyInstaller 是一款強大的封裝工具,支援 Windows、Linux 和 macOS 等多個平台。首先,確認系統環境符合 PyInstaller 的需求:Windows XP 或更新版本、Linux 系統需安裝特定的終端應用程式、macOS 則需 10.7(Lion)或更新版本。可以使用 Wine 在 Linux 或 macOS 上交叉編譯 Windows 可執行檔。

安裝與基本使用

在虛擬環境中使用 pip 安裝 PyInstaller:

$ pip install pyinstaller

建立標準可執行檔的指令如下:

$ pyinstaller script.py

若要建立無視窗的 macOS 或 Windows 應用程式,可使用 --windowed 選項:

$ pyinstaller --windowed script.spec

執行後,PyInstaller 會產生 .spec 檔案、build 資料夾和 dist 資料夾。其中,dist 資料夾包含主要的可執行檔和依賴的 Python 函式庫。

自訂封裝設定

.spec 檔案可被編輯以自訂封裝設定,包括捆綁資料檔案、加入執行階段函式庫和新增 Python 執行階段選項。這使得未來建置更加容易,並可與版本控制系統結合使用。

# 範例 .spec 檔案部分內容
a = Analysis(['script.py'],
             pathex=[],
             binaries=[],
             datas=[('data.txt', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=None)

內容解密:

  • Analysis 類別用於分析指令碼及其依賴項。
  • datas 引數用於加入額外的資料檔案,如此例中的 data.txt
  • binarieshiddenimports 可用於加入額外的二進位檔案和隱式匯入的模組。

cx_Freeze:另一個跨平台的選擇

cx_Freeze 是另一個流行的封裝工具,支援 Linux、macOS 和 Windows。首先,使用 pip 安裝:

$ pip install cx_Freeze

可透過 cxfreeze-quickstart 指令產生基本的 setup.py 檔案,並根據需求進行修改。

使用 setup.py 封裝

修改 setup.py 以符合應用程式需求。範例如下:

from cx_Freeze import setup, Executable

setup(
    name='hello_world',
    version='1.0',
    description='This application says hello.',
    executables=[Executable('hello.py')]
)

內容解密:

  • Executable 類別用於定義要封裝的可執行檔。
  • setup 函式用於組態封裝過程,包括名稱、版本和描述等資訊。

py2app:專為 macOS 封裝的工具

py2app 是專門為 macOS 封裝 Python 應用程式的工具。首先,使用 pip 安裝:

$ pip install py2app

然後,使用 py2applet 指令產生基本的 setup.py 檔案:

$ py2applet --make-setup hello.py

最後,執行 setup.py 以建立 builddist 資料夾:

$ python setup.py py2app

內容解密:

  • py2applet 命令用於產生初始的 setup.py
  • py2app 命令用於實際封裝應用程式。

封裝與釋出Python應用程式

在軟體開發的過程中,將Python應用程式封裝並釋出到不同的平台上是一個重要的步驟。本文將介紹多種封裝工具和方法,包括凍結(freezing)、建立Linux發行版套件以及建立可執行的ZIP檔案。

凍結Python程式碼

凍結是一種將Python應用程式及其依賴項封裝成獨立可執行檔的方法。這種方法適用於Windows、macOS和Linux等不同平台。常見的凍結工具包括cx_Freeze、py2app、py2exe和bbFreeze。

cx_Freeze

cx_Freeze是一個流行的凍結工具,支援Python 3.x版本。要使用cx_Freeze,首先需要安裝它:

$ pip install cx_Freeze

接下來,建立一個setup.py檔案來組態cx_Freeze:

from cx_Freeze import setup, Executable

setup(
    name="hello",
    version="1.0",
    description="My Hello World Application",
    executables=[Executable("hello.py")],
)

然後,執行以下命令來建立可執行檔:

$ python setup.py build

py2app

py2app是另一個凍結工具,主要用於建立macOS上的應用程式。要使用py2app,首先需要安裝它:

$ pip install py2app

建立一個setup.py檔案:

from setuptools import setup

APP = ['hello.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

執行以下命令來建立應用程式:

$ python setup.py py2app -A

py2exe

py2exe是一個用於建立Windows可執行檔的工具。要使用py2exe,需要安裝它:

$ pip install py2exe

建立一個setup.py檔案:

from distutils.core import setup
import py2exe

setup(
    windows=[{'script': 'hello.py'}],
)

執行以下命令來建立可執行檔:

$ python setup.py py2exe

bbFreeze

bbFreeze是一個較舊的凍結工具,目前沒有維護者,支援Python 2.x版本。要使用bbFreeze,需要安裝它:

$ pip install bbfreeze

建立一個setup.py檔案並新增bdist_bbfreeze命令:

from distutils.core import setup
import bbfreeze

setup(
    # 其他設定...
    cmdclass={'bdist_bbfreeze': bbfreeze.BBFreezeCommand},
)

執行以下命令來建立可執行檔:

$ python setup.py bdist_bbfreeze

為Linux發行版建立套件

為Linux發行版建立套件是一種將Python應用程式封裝成特定Linux發行版格式的方法,例如RPM或DEB。

使用bdist_rpm建立RPM套件

Python的標準函式庫中的distutils模組提供了bdist_rpm命令,可以用來建立RPM套件。

$ python setup.py bdist_rpm

建立可執行的ZIP檔案

Python支援直接執行包含__main__.py檔案的ZIP檔案。這是一種簡單的封裝純Python應用程式的方法。

首先,建立一個包含__main__.py檔案的ZIP檔案:

$ zip app.zip __main__.py

然後,可以直接執行這個ZIP檔案:

$ python app.zip

內容解密:

  • 使用cx_Freeze、py2app、py2exe和bbFreeze等工具,可以將Python應用程式凍結成獨立的可執行檔,方便在不同平台上釋出。
  • 為Linux發行版建立套件,例如RPM或DEB,可以使應用程式更好地整合到特定的Linux發行版中。
  • 建立可執行的ZIP檔案是一種簡單的封裝純Python應用程式的方法,適用於不需要特定平台依賴的應用程式。

將Python程式封裝成可執行檔

Python程式可以被封裝成ZIP檔案並直接執行,只要目標系統上安裝了Python。這種方法不僅方便分發,也能夠建立自包含的應用程式。

建立可執行的ZIP檔案

首先,你需要建立一個包含__main__.py檔案的ZIP檔案。例如,如果你有以下目錄結構:

.
|--- __main__.py

你可以使用以下命令將其封裝成ZIP檔案:

$ zip machine.zip __main__.py

然後,你可以直接使用Python執行這個ZIP檔案:

$ python machine.zip
ping!

建立自包含的可執行檔

進一步地,你可以透過在ZIP檔案前新增POSIX “shebang”(#!)來建立一個可執行檔。首先,建立一個名為machine的檔案,並將shebang寫入其中,然後將ZIP檔案的內容附加到這個檔案:

$ echo '#!/usr/bin/env python' > machine
$ cat machine.zip >> machine
$ chmod u+x machine

現在,你可以直接執行這個檔案:

$ ./machine
ping!

使用zipapp模組

從Python 3.5開始,標準函式庫中包含了zipapp模組,使得建立可執行的ZIP檔案變得更加方便。使用這個模組,你可以避免將主檔案命名為__main__.py的限制。

將依賴項封裝進ZIP檔案

如果你將依賴項放在專案目錄中,並修改了匯入陳述式,那麼你就可以建立一個包含所有依賴項的可執行ZIP檔案。例如,假設你的目錄結構如下:

.
|--- archive/
|    |--- __main__.py

並且你正在一個虛擬環境中執行,該環境中只安裝了你的依賴項。你可以透過以下步驟將依賴項封裝進ZIP檔案:

  1. 安裝依賴項到特定目錄:使用pip freeze列出所有依賴項,並使用pip install --target=packages將它們安裝到packages目錄中。同時,建立一個空的__init__.py檔案在packages目錄下,以使其成為一個Python包。

    $ cd archive
    $ pip freeze | xargs pip install --target=packages
    $ touch packages/__init__.py
    

    目錄結構現在看起來像這樣:

    .
    |--- archive/
    |    |--- __main__.py
    |    |--- packages/
    |    |    |--- __init__.py
    |    |    |--- dependency_one/
    |    |    |--- dependency_two/
    
  2. 修改匯入陳述式:更新你的程式碼,以使用新的packages目錄中的依賴項。

    import packages.dependency_one as dependency_one
    
  3. 封裝:使用zip -r命令遞迴地將所有目錄封裝進ZIP檔案。

    $ cd archive
    $ zip machine.zip -r *
    $ echo '#!/usr/bin/env python' > machine
    $ cat machine.zip >> machine
    $ chmod ug+x machine
    

內容解密:

  1. zip machine.zip __main__.py:將__main__.py檔案壓縮成名為machine.zip的ZIP檔案。
  2. python machine.zip:使用Python直譯器執行ZIP檔案,因為Python能夠識別並執行ZIP檔案中的__main__.py
  3. echo '#!/usr/bin/env python' > machine:在新檔案machine中寫入shebang,指定使用環境中的Python直譯器來執行該檔案。
  4. cat machine.zip >> machine:將ZIP檔案的內容附加到shebang之後,形成一個可執行的檔案。
  5. chmod u+x machine:賦予machine檔案執行許可權,使其能夠被直接執行。
  6. pip freeze | xargs pip install --target=packages:列出目前環境中所有已安裝的套件,並將它們安裝到packages目錄中,以包含依賴項。
  7. touch packages/__init__.py:建立一個空的__init__.py檔案,使packages目錄成為一個有效的Python包。
  8. import packages.dependency_one as dependency_one:修改匯入陳述式,以便正確地從packages目錄中匯入依賴項。
  9. zip -r machine.zip *:遞迴地將當前目錄下的所有檔案和子目錄封裝進ZIP檔案。

Jupyter筆記本簡介

Jupyter是一個允許使用者互動式地顯示和執行Python程式碼的網路應用程式。它提供了一個使用者友好的介面,用於資料科學、科學計算和教育。

Jupyter的主要特點

  • 互動式執行:Jupyter允許使用者在網頁瀏覽器中輸入和執行Python程式碼,並立即檢視結果。
  • 多語言支援:除了Python,Jupyter還支援多種其他程式語言,如R、Julia和Scala。
  • 豐富的輸出格式:Jupyter支援多種輸出格式,包括HTML、Markdown和LaTeX,能夠呈現豐富的多媒體內容。
  • 易於分享:Jupyter筆記本可以輕易地被分享和重複使用,非常適合教學、研究和合作專案。

安裝Jupyter

Jupyter可以透過pip安裝:

$ pip install jupyter

內容解密:

  1. pip install jupyter:使用pip安裝Jupyter套件,使其在本地環境中可用。
  2. Jupyter的多語言支援:Jupyter透過不同的核心(kernel)支援多種程式語言,使得使用者可以在同一個介面中使用不同的語言進行計算和資料分析。