Warning: リポジトリと同期できません (サポートされていないバージョンコントロールシステム "svn です。 Python のライブラリに "svn" が正しくインストールされているか確認してください。)

PyDevでTracのPluginを開発する。

PyDevはEclipsのPython用プラグイン。
これをつかってTracのPlugin開発をしてみる。

前提ソフトは以下のもの。他のバージョンで動くかどうかは不明。(追記:WindowsXP,Trac0.11rc1でもOKでした)

  • Windows Vista
  • JDK1.6
  • Eclipse Version: 3.3.1.1 Build id: M20071023-1652
  • Python 2.5
  • Trac 0.11dev-r5883

とりあえず上のものは、インストールされており、動くこと。
tracも、プロジェクトをつくり、tracdで動く状態にしておく。

まず、Eclipsを起動し、PyDevをインストールする。
メニューのウィンドウ→ヘルプ→ソフトウェアの更新→検索およびインストール...。
ダイアログが出るので、「インストールする紳士フィーチャーを検索」を選択して「次へ>」。
「新規リモート・サイト」を押して以下のように入力。
その後、インストールダイアログの終了ボタンを押すとインストーラが走る。

メニューのウィンドウ→設定。
インタープリター-Pythonを左のツリーで選び、右上の「新規」ボタンを押してpython.exeのパスを入力する。
PYTHONPATHにどれを含めるか聞かれるけど、とりあえずデフォルトで。
強制組み込みライブラリーとかはとくに触らない。

プロジェクトを作る。
メニューのファイル→新規→PyDevプロジェクト。
プロジェクト・タイプでPythonのバージョンを選択。
「デフォルトの'src'フォルダーを作成し、…」のチェックボックスは外しておく。
ちなみに、ディレクトリーに書いてあるパスにフォルダが作られる。

上記でつくられたフォルダの中に、プラグインのソースをコピーする。
(ここでは、もう開発中のプラグインのソースが存在する前提で書いてます。
なければ、TracHackのチュートリアルのソースでも使ってください。)
プロジェクト名を右クリックして「更新」を選ぶとパッケージエクスプローラに表示される。
ちなみ私の環境はこんな感じ。
プラグイン別にフォルダを分けてます。

プラグインを開発するときは、プラグインの開発版をインストールするフォルダを別に用意しておくとよい。
上記の例で言うとpythonpathというフォルダがそれ。とりあえずフォルダを作る。
作ったら、コマンドプロンプトで以下のように入力し、プラグインをコンパイルする。
ちなみに、引数の「develop」をつけておくと、ソース変更時にいちいちEggを作り直す必要がない。

> CD プラグインのsetup.pyのあるフォルダ
> python setup.py develop --install-dir=上で作ったプラグイン開発版インストールフォルダ

プラグイン開発版インストールフォルダを作ったら、プロジェクトを選んで右クリックし「プロパティー」を選択。
プロパティダイアログでPyDev - PYTHONPATHを選び、作ったフォルダを追加する。

ここ以外にもPYTHONPATHを入力できるところがあるけど、ここで入力しないと実行時に反映されないみたい。


次にEclipsからTracdを起動できるようにする。
メニューの実行→実行ダイアログを開く...。
「Python 実行」を右クリックして「新規」を選択。
Mainタブでは名前、プロジェクト、メイン・モジュールを入力。(メインモジュールは参照ボタンを押さずに直接tracd-script.pyのパスを入力する。)

おなじくArgumentsタブを入力する。
プログラムの引数は適当に変えること。

tracdには-rというオプションがあり、これを使うといちいちtracdの再起動をしなくてもソースの変更が即反映されるんだけど、WindowsのPyDevでそれを指定してはいけない。実行後にtracdを終了できなくなる。

-rつきだと、監視役と動作役の2つのPythonプロセスが起動するみたい。PyDevからの終了では、1つ(監視役?)しか終了しない。

簡単にPythonプロセスを止める方法は、もうちょっと下にある「つづき」を参照

環境タブ。
エンコードをUTF-8にする。
お気に入りのメニュに表示を選ぶ。
バックグラウンドでの起動をチェックする。

実行してみる。

ブラウザでURLにアクセス。
(ちなみに作ったプラグインをAdminタブなりtrac.iniで有効にしておないと当然プラグインは認識されません。注意)

止めるには、コンソールの赤いボタンを押す。

以上。デバッグも動いたよ。

つづき

上記でも一通り動くんですが、

  • tracdを複数同時に起動できてしまう。 気づくとpython.exeプロセスがいっぱい。
  • 一度とめて再起動はめんどくさい。オートリロードみたいなの欲しい。

というわけで、複数同時起動を防止しつつ簡単に再起動できる方法を考えてみました。

手順:

1. 以下のVBScript(KillOldPython.vbs)を適当なフォルダにおく。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _[[BR]]    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'Python.exe' ")'WMIにはソート機能がないので、自前で最後に起動したプロセスを探す。
lastTime =0
For Each objProcess in colProcessList
     If objProcess.CreationDate > lastTime Then
        lastTime = objProcess.CreationDate
        lastProcessId = objProcess.ProcessId
    End If
Next
'最後に起動したプロセス以外を終了する。
For Each objProcess in colProcessList
    If objProcess.ProcessId <> lastProcessId Then
        objProcess.Terminate()
    End If
Next

2. C:\Python25\Scripts\tracd-script.pyを元に、以下のようなtracd-script-dev.pyを作る。

sys.exitのまえでKillOldPython.vbsを呼び出すようにします。パスやバージョンは環境に合わせること。

# EASY-INSTALL-ENTRY-SCRIPT: 'Trac==0.11dev-r5883','console_scripts','tracd'
!__requires!__ = 'Trac==0.11dev-r5883'
import sys
import os
from pkg_resources import load_entry_point
os.system(r"wscript.exe C:\Python25\Scripts\KillOldPython.vbs")
sys.exit(
   load_entry_point('Trac==0.11dev-r5883', 'console_scripts', 'tracd')()
)

3.PyDevの実行ダイアログで、tracd-script-dev.pyを起動するよう設定する。

以上。

これを起動すると、自分以外のpython.exeプロセスを殺してからtracが起動します。
ワンクリック再起動(実際には2クリックだけど)できます。

注意:tracd以外にpython.exeが動いていると、そいつも終了させてしまいます。
プロセスを見て、常に動いているpython.exeがいないか確認してから設定すること。

添付ファイル