前の月 / 最新

hiChangeLog / 2010-03

2010-03
SMTWTFS
123456
78910111213
14151617181920
21222324252627
28293031

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

2010-03-08 Mon

ipythonで任意の関数の実行時にデバッガを起動する [python]

ipythonは便利だ。pdbコマンドをトグルしておくとキャッチしてない例外発生時に自動的にそこに飛んでデバッガも起動してくれる。
従って、予期せぬ例外発生時には即座に対応できるし、また、怪しい箇所に適当に例外を投げるコードを入れておけば、そこからデバッガを開始できる。以下にもその旨解説されている。http://wiki.slash-reader.com/sonota--memo/ipython_
さて任意の関数の実行時にデバッガを起動したい場合どうするか。直前に述べたように、適当なコードをあらかじめ埋めておくのがひとつの方法。でもこれに以下の不満を抱くため、代替について調べた。
・コード埋める作業が面倒
・一時的な作業のためにソースファイルに手を入れたくない

runcallを使えばいけるようだ。
aはとあるクラス、fugaはそのクラスのメソッドとすれば、以下でデバッガが起動する。

In [xx]: import pdb
In [xx]: pdb.runcall(a.fuga)
引数を渡す場合は以下の様にする。
pdb.runcall(a.fuga, s1='foo', s2='bar')
さてこのpdbはpythonのデバッガだが、これに比べ、上で述べたipythonで起動してくれるデバッガは、色付けなんかをしてくれて圧倒的に見易い。こちらを使いたい場合は以下の様にする。(引数の文字列"Linux"で色使いを指定している。これが無いと色はつかない)
In [xx]: import IPython
In [xx]: p = IPython.Debugger.Pdb('Linux')
In [xx]: p.runcall(a.fuga, s1='foo', s2='bar')

Webで調べたところ、コードに pdb.set_trace とか例外コードを埋め込む解説が目立ったので、もしかしたら上記方法は作法としての欠点があるのかもしれないが、個人的には好みなのでしばらくこれでいってみる。

以下pdbについてのページ。
pdb の使い方 -- 導入編
pdb の使い方 -- コマンド編
Pythonのデバッガ(pdb)を使う

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2010-03-08 22:21