« OS X 10.7(Lion)でTracのHello Worldプラグインを作ってみた | メイン | TraChat - Tracにチャット機能を追加するプラグイン(WebSocket使用) »

OS X 10.7(Lion)でTracのプラグインのライフサイクルを調べてみた

今回のエントリーはかなり憶測を含むので注意。
Tracのプラグインは初期化時に「__init__.py」が読み込まれるっぽい。
また、Pythonのパッケージはサブディレクトリ名をレシーバに指定しメソッドを呼ぶっぽい。
また、リファレンスを見ていると初期化メソッドとして「__init__()」を指定することがわかった。
Pythonのパッケージは少なくとも「__xxx___()」形式のメソッドの代わりに、「__xxx__.py」を使っていると推測できる。
インスタンスを解放する時には「__del__()」を実行するらしいので、パッケージだと「__del__.py」を作成すればよさそう。
ここで疑問に思うには、Tracのプラグインのライフサイクル。
つまり、「__init__.py」と「__del__.py」はどのタイミングで実行されるのか。
そこで、前回作ったHello Worldプラグインに、次のような「__init__.py」と「__del__.py」を作成した。
__init__.py
# Helloworld module
from helloworld import *

print "init!"
__del__.py
print "del!"
これをパッケージ化してTracにインストール、ブラウザからアクセスしてみる。
結果は、「__init__.py」は、Tracの起動時ではなく初回アクセス時だった。
「__init__.py」はと言うと...、Tracを終了しても実行されない。
(アクセス直後は何故かctrl+Cでは終了できないので、時間をあけてからctrl+Cを実行。)
憶測を誤ったか、終了時はコンソール出力ができないのかよくわからない。
__init__.pyはパッケージ独自の話で、もしかしてこのファイル内にメソッドを定義しないといけないんじゃないかと思い、次のように変更して試してみた。
__init__.py
# Helloworld module
from helloworld import *

print "init file!"

def __init__(self):
    print "init method!"

def __del__(self):
    print "del method!"
「init file!」しか実行されず。
完全に推測誤った...。
パッケージの後処理どうやるんだろう...。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド