WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Python 3.5のzipappで実行可能なアーカイブを作る

サーバーエンジニアの原です。

Python 3.5は現在開発中ですが、すでにアルファ版が公開されています。そこで、個人的に気になっているzipappというモジュールを試してみました。

python 3.5のアルファ版は、pyenvであれば簡単にインストールできます。
ただ、ダウンロードとインストールに非常に時間がかかるので注意が必要です。

$ pyenv install 3.5-dev  
$ pyenv local 3.5-dev

zipappとは

zipappモジュールは、実行可能なzipアーカイブを管理することができるモジュールです。

Python3.5より前のバージョンでは、第3者の実行可能なPythonプログラムを動作させようとした場合、ソースコードを取得した後、そのPythonプログラム特有のスクリプトをPythonインタプリタで実行する、という手順が一般的でした。

Python 3.5では、zipappを用いてzipアーカイブしたソースコードを解凍せずに実行することができます。

zipappを使ってみる

では、早速zipappを使って、実行可能なアーカイブファイルを作ってみましょう。

以下のようなファイル構成を想定します。

└── myapp  
     └── __main__.py

_main_.py というファイルはzipappで規定されている特別なファイルです。このファイルがプログラム実行時のエントリーポイントとなります。

_main_.py にお約束のアレを記述してみます。

print("Hello, world")

以下のコマンドで、実行可能なアーカイブファイルを作成できます。

$ python -m zipapp myapp

上記のコマンドを実行すると、myapp.pyzというファイルが作成されます。これが実行可能なPythonのzipアーカイブファイルです。

pythonコマンドの引数にそのファイル名を指定することで、実行することができます。

$ python myapp.pyz  
Hello, world

任意の関数をエントリーポイントにする

_main_.pyを用意する他、任意の関数をエントリーポイントとすることもできます。

以下のようなファイル構成を想定します。

└── myapp2  
     └── run.py

run.pyには、以下のようなエントリーポイントとなる関数を定義しておきます。

def run_app():  
    print("Run this application.")

任意の関数をエントリーポイントとするには、実行可能アーカイブファイルを作成する際に、どの関数をエントリーポイントにするかを指定します。 先ほどと同様に、myapp2.pyzというファイルが作成されます。実行方法は同じです。

$ python -m zipapp myapp2 -m "run:run_app"  
$ python myapp2.pyz  
Run this application.

まとめ

Python 3.5で導入されるzipappを使って、実行可能なアーカイブが作成できることが確認できました。

このzipappにより、Webアプリケーションのデプロイの一手間が減らしたり、依存ライブラリをzipアーカイブにまとめることでデプロイ後の依存ライブラリのインストールをする手順を排除したりできそうです。

さらに、Webアプリケーションコンテナのような仕様が出てきてホットデプロイできるようになったり、複数アプリケーションを同一プロセスの異なるスレッドで動かしたり、といったことができるようになるかもしれません。(Jのつく言語的なアレです)

zipapp以外にも、Python 3.5にはaysnc/awaitやtype assertionといった魅力的な機能が追加されることが予想されます。今から楽しみですね!