oinume journal

Scratchpad of what I learned

traceモジュールを使ってPythonプログラムの挙動を把握する

Pythonにはtraceモジュールというものが標準ライブラリであって、これを使うとpythonプログラムを実行した時に、どのモジュールのどの関数を呼んでいるかの情報を出力することができる。使いどころとしては、使っているライブラリやツールが「これ実際どう動いてるんだろう?」っていうのを把握したい時に重宝すると思う。pdbなんかのデバッガでもいいんだけど、「ブワッとトレース実行した結果を出しておいてあとで一気に見る」みたいな時に特に有用だと思う。

使ってみよう

ためしにtomahawkをtrace使って実行してみた。

$ python -m trace -t /usr/local/bin/tomahawk -h localhost uptime

実行には -m trace と -t (--trace) オプションをつける。実行結果はこんな感じ。

 --- modulename: tomahawk, funcname: <module>
tomahawk(4): import sys
tomahawk(6): try:
tomahawk(7):     import bootstrap
tomahawk(10): except:
tomahawk(11):     pass
tomahawk(13): from tomahawk.command import CommandMain
 --- modulename: __init__, funcname: <module>
__init__.py(1): from tomahawk.constants import *
 --- modulename: constants, funcname: <module>
...

やってみるとわかるけど、標準ライブラリのコードまで延々とトレース実行される... 「標準ライブラリの中はどうでもいいんだよ」ということであれば、--ignore-module=os,sys みたいな感じで除外するモジュールをカンマ区切りで指定できる。

tomahawkの場合は以下のように使っているライブラリを除外したらけっこうまともなトレースが得られた。

$ python -m trace -t --ignore-module=threading,queues,pool,Queue,sre_parse,process,forking,pexpect,weakref,util,pty,string,sre_compile,__init__,re,posixpath,expect,UserDict,connection,synchronize,tempfile,random,hashlib,__future__,abc,_weakrefset,io,socket,subprocess,copy,textwrap,locale,pickle,gettext,argparse,os,ConfigParser,platform,functools,stat,genericpath,getpass,base /usr/local/bin/tomahawk -h localhost uptime

traceモジュールは、この他にも -T(--trackcalls) で関数呼び出しの関連(どの関数がさらにどの関数を呼んでいるか)も明らかにしてくれたりするのでけっこう便利だな−と思った。Pythonってこういうモジュールが標準添付されてるのがいいっすな。

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)