zipapp が便利そうだったので書く

2015/12/07

この記事は、 2015 tech-yuruyuru アドベントカレンダー 7 日目の記事です。

zipapp について

以下のようなディレクトリ構成とする。

test001/
├── __init__.py
└── __main__.py

__init__.py は空のファイル、 __main__.py の中身は以下とする。

print('hello, world')

通常、この場合以下のように実行することができる。

$ python2.7 test001/
hello, world

さらに、このディレクトリ構成で、 test001 内を zipファイルとして まとめると、この zipファイルを読み込み実行することができる。

まず、zipファイルは以下のように作成する。

$ cd test001
$ zip test001.zip -r *
adding: __init__.py (stored 0%)
adding: __main__.py (stored 0%)

この状態で python インタプリタに引数として渡すと、実行される。 これでも、便利だと思う。

$ python2.7 test001.zip
hello, world

さて、 zipapp だ。拡張子は .pyz となるが、作成しよう。 実行可能なバイナリを作成したいので、 -p オプションで shebang を指定しよう。

$ rm test001.zip
$ cd ..
$ python3.5 -m zipapp -p '/usr/bin/env python2.7' test001/

この状態で .pyz ファイルは実行可能だ。実行してみよう。

$ ./test001.pyz
hello, world

このように、適切に作成したモジュールを簡単に実行可能なバイナリに変換できて、 とても便利だと思います。