SyntaxHighlighter

2016年4月3日日曜日

Stackless Python と 1 バイナリの python.exe

Stackless Python と 1 バイナリの python.exe

仕事で Stackless Python を 1 バイナリの exe にして使ってみようと思ったので、少し整理してみました。
Python 2.7.9 に基づいたものですが、1 バイナリにしたものを python.exe からダウンロードできるようにしてあります。

また、これまで割と Ruby を使うことが多かったのですが、 Stackless Python のとある特長を活用したかったので、勉強してみました。

Stackless Python

Python には様々な亜種がありますが、その中の一つ Stackless PythonPyPy は、「tasklet や continulet を pickle できる」という大きな特徴があります。
他のプログラミング言語で言うと、 JavaScript のジェネレータや Ruby の Fiber を、保存可能な形式にシリアライズできる、ということです。

これができるということは、スクリプトを途中まで実行して中断し、後からその続きを実行する、ということが実現できます。
これが実現したかったので、今回は Stackless Python を使ってみました。

この処理は、オリジナルの Python では実現できませんが、 Stackless Python では少し Python インタプリタを変更することで、これを実現しています。

また、オリジナルの Ruby でも、実現ができません。
実装上の種々の理由がありますが、 Ruby では例外の捕捉と生成に setjmplongjmp を使っているので、なかなか難しいだろうと思います。

1 バイナリの python.exe と embeddedimport

利便性から、この Stackless Python を、できれば 1 バイナリにしておこうと思いました。
これは、python.exe hoge.py のように python.exe のみがあればスクリプトを実行できた方が、私の環境では都合がよかったからです。

そのため、 Stackless Python をスタティックビルドするとともに、既存の標準添付ライブラリの .py ファイルを、すべて python.exe の中に組み込むことにしました。

embeddedimport という名前のライブラリが、これを実現しています。
原理的には、標準ライブラリの zipimport と似たような仕組みで、 python.exe の中に静的に持っている .py ファイルの内容をロードしています。

このようにして得られた python.exe を BitBucket の python.exe に置いておきました。
また、 embeddedimport については、別途、時間があればまとめようと思います。

近頃、忙しいのでなかなかプログラミングができません。

2018年3月追記:

AppVeyor を使い始めたので、 GitHub のリリースページに各種バイナリを置くようにしました。