サーバーエンジニアの原です。
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といった魅力的な機能が追加されることが予想されます。今から楽しみですね!