Stackless Python と 1 バイナリの python.exe
仕事で Stackless Python を 1 バイナリの exe にして使ってみようと思ったので、少し整理してみました。
Python 2.7.9 に基づいたものですが、1 バイナリにしたものを python.exe からダウンロードできるようにしてあります。
また、これまで割と Ruby を使うことが多かったのですが、 Stackless Python のとある特長を活用したかったので、勉強してみました。
Stackless Python
Python には様々な亜種がありますが、その中の一つ Stackless Python や PyPy は、「tasklet や continulet を pickle できる」という大きな特徴があります。
他のプログラミング言語で言うと、 JavaScript のジェネレータや Ruby の Fiber を、保存可能な形式にシリアライズできる、ということです。
これができるということは、スクリプトを途中まで実行して中断し、後からその続きを実行する、ということが実現できます。
これが実現したかったので、今回は Stackless Python を使ってみました。
この処理は、オリジナルの Python では実現できませんが、 Stackless Python では少し Python インタプリタを変更することで、これを実現しています。
また、オリジナルの Ruby でも、実現ができません。
実装上の種々の理由がありますが、 Ruby では例外の捕捉と生成に setjmp
と longjmp
を使っているので、なかなか難しいだろうと思います。
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
については、別途、時間があればまとめようと思います。
近頃、忙しいのでなかなかプログラミングができません。
AppVeyor を使い始めたので、 GitHub のリリースページに各種バイナリを置くようにしました。
0 件のコメント:
コメントを投稿