Mod_pythonアプリケーションをpdbでデバッグ
posted by jun-g at Mon, 28 May 2007 17:47 JST
今年の2月にリリースされたMod_python-3.3.1から、ディレクティブで設定できる項目が沢山増えてる事にこないだ気づいた。その中にPythonEnablePdbっていう設定を発見。え?mod_pythonでpdb使えるの?って事で試してみた。
test.pyとして以下のコードをpublic_html直下に置いた。
# coding: utf-8 from mod_python import apache def handler(req): req.content_type = "text/plain" req.write("Hello, Mod_python!\n") return apache.OK
でもって.htaccessに以下を設定を書いた。
AddHandler python-program .py PythonHandler test PythonEnablePdb On
ブラウザからリクエストを投げてみると、何事もなくブラウザ上に「Hello, Mod_python!」と表示された。ドキュメントには「httpdを-DONE_PROCESSオプションを付けて起動せよ」と書いてあるので、その通りapacheを再起動してみる。
# apachectl -k stop # apachectl -DONE_PROCESS
すると、コマンドライン上はプロンプトが返ってこず、応答待ちの状態となった。psコマンドで見てみると、httpdプロセスはひとつだけ動いてる状態になっている。
# ps ax | grep http 78398 p4 S+ 0:01.73 /usr/local/sbin/httpd -DONE_PROCESS
この状態でブラウザからリクエストを投げてみると、応答待ちだったコマンドライン上でおもむろにpdbが起動し、コマンド入力待ちになった。適当にpdbのコマンドを実行してみる。
> /home/jun-g/public_html/test.py(6)handler() -> req.content_type = "text/plain" (Pdb) l 1 # coding: utf-8 2 3 from mod_python import apache 4 5 def handler(req): 6 -> req.content_type = "text/plain" 7 req.write("Hello, Mod_python!\n") 8 return apache.OK 9 [EOF] (Pdb) p req.uri '/~jun-g/test.py' (Pdb) r --Return-- > /home/jun-g/public_html/test.py(8)handler()->0 -> return apache.OK (Pdb) s
最後まで実行すると普通にブラウザに応答が返ってきた。なるほど。本当にpdbでデバッグできるようになってるみたい。
しかし…これは…便利なのか…?普段ほとんどpdbを使っていないからかもしれないけど、便利かどうか判断がつかない。個人的には今までどおりprintデバッグで十分かな。あと-DONE_PROCESSで起動した場合のhttpdの止め方がわからん。apachectl -k stopでは止まらなかったので、結局kill -9で殺した。
他に以前のバージョンとの違いで気付いた点は
- PythonDebugを有効にした場合のトレースバックに色々情報が出るようになった。
- PythonPathに仮想ディレクトリを指定するとエラーになるようになった。
ぐらいかな。あと、mod_pyhton.util.Fieldもちょっと変わってて、以前書いたコードがそのままじゃ動かなかった。けどそれは以前のコードの書き方がまずかっただけかもしんないので、詳細はふせとこう。
ところでDjangoとかTrac経由じゃなくて、直接Mod_python触ってる人っているんかな…。