2011/10/19

cx_Freezeが簡単だったので簡易JITコンパイラをビルドしてみた

今までPythonスクリプトのexe化には、py2exe一択だった。
最近emailモジュール関連のお陰で、py2exeを使えないことが判明してハマった。
だいぶ前のPyJUGのMLに、cx_Freezeの話があったの思い出したので試食してみたところ、
py2exeみたいにsetup.pyを書かなくても良いものの、defaultencodingの指定が必要だったりと色々な罠があった。
けれど、当初の目的だったemailモジュール関連も簡単にビルド出来た。
これに味をしめて、簡易JITコンパイラをビルドしてみた。

■ビルドするスクリプト( engine.py )
#/usr/bin/python                                                                
# -*- coding: utf-8 -*-                                                         
import os,sys,imp

if hasattr(sys,"setdefaultencoding"):
    sys.setdefaultencoding("utf-8")

def is_frozen():
    return ( hasattr(sys, "frozen") or # new py2exe                             
             hasattr(sys, "importers") # old py2exe                             
             or imp.is_frozen("__main__") ) # tools/freeze                      

def get_exec_dir():
    return os.path.abspath(
        os.path.dirname(
            sys.executable if is_frozen() else sys.argv[0]
            )
 )

if __name__ == '__main__':
    if len(sys.argv) > 1:
        mdfile = sys.argv[1]
        if os.path.exists(mdfile):
            mdname = mdfile.strip('.py')
            md = __import__(mdname)
            md.bootstrap( get_exec_dir() )

■動的実行するサンプルスクリプト( sample.py )
#/usr/bin/python                                                                
# -*- coding: utf-8 -*- 
import sys                                      
def bootstrap( execdir ):
   print execdir
   print sys.argv

■ビルドコマンド
cxfreeze engine.py
■サンプルスクリプト実行コマンド例
engine.exe sample.py hoge
c:\dist\
[ 'engine.exe', 'sample.py', 'hoge' ]

Farewell, vbs and wsh ! これで多少は可搬性の良いマルチプラットフォームなスクリプト実行環境が構築出来る。 GUIが必要になったら、メッセージダイアログとか程度ならTKinter等で頑張ればいい。

0 件のコメント: