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サポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (30件) を見る