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)

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

Markdownをアメブロ向けのHTMLに変換するヤツ作った

会社のエンジニアブログを書いていて、あまりにもアメブロのエディタがしんどかったのでカッとなって作ってしまった。これでエンジニアブログ書くのが捗ると思う。heroku上のサンプルはここ

使った技術

  • Python 2.7
  • misaka - MarkdownをHTMLに変換するライブラリ
  • heroku

herokuはGitリポジトリにpushするだけでディプロイ出来て便利だなーと思った。

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

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

Pythonでローカル変数の値をprintfデバッグしたい

 

a = 1

b = 2

print("locals = " + str(locals()))

 

こんな風に書くとローカル変数の値が簡単にデバッグできるかなーと思った。

 

 

locals = {'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__file__': '/Users/oinuma_kazuhiro/Dropbox/code/python/locals.py', '__package__': None, '__name__': '__main__', '__doc__': None}

 

 

ただ、余計なものまで表示されてしまうので、特定の変数だけprintしたい場合は下記のようにする。

 

a = 1

b = 2

print("a = {a}, b = {b}".format(**locals()))

 

 

 

a = 1, b = 2

 

 

なんかもっといいやり方ありそう。

 

[tmkm-amazon]477415539X[/tmkm-amazon]

Pythonで標準出力をキャプチャする

PerlだとCapture::TinyというCPANモジュールがあるのだけど、Pythonだとやり方がわからなかったので調べてみたところ、Capture stdout from a script in Python - Stack Overflowで色々とやり方が紹介されている。

 

普通に標準出力の内容を文字列として取りたいだけなら下記でいいんじゃないかと思われる。Python詳しくないのでもっとスマートな方法があれば教えてほしいです。

 

 

withが使えるといいカンジで書けますな。

 

[tmkm-amazon]4798032948[/tmkm-amazon]

pythonbrewで新しいPythonをインストールできるようにする

Python-2.7.3がリリースされたので早速入れようと思ったら

 

$ pythonbrew install 2.7.3

ERROR: Unknown python version: `Python-2.7.3`

 

と言われて残念な気持ちになったので、どうすればpythonbrewで新しいPythonがインストールできるか調べてみた。

 

やり方は簡単で $PYTHONBREW_ROOT/etc/config.cfg に下記のように追加すればいいだけだった。

 

$ diff -u config.cfg.orig config.cfg

--- config.cfg.orig 2012-04-15 01:34:23.000000000 +0900

+++ config.cfg 2012-04-15 01:35:09.000000000 +0900

@@ -154,6 +154,9 @@

 

[Python-2.7.2]

url = http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz

+

+[Python-2.7.3]

+url = http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz

latest = True

 

[Python-3.0]

 

 

追記したらいつものようにインストールするだけ。

 

$ pythonbrew install 2.7.3

 

 

[tmkm-amazon]4798032948[/tmkm-amazon]