IPythonのlogの話

  • February 01, 2008 08:00

IPythonにはマジックコマンドという便利な機能があって

%コマンド

でログをとってくれたり、 pdb(デバックツール)を起動してくれたり、いろいろ嬉しいのですが

ログの %logon %logoff %logstart %logstate

が、どうしてもうまく使いこなせない。 しかし、対話式で試したことは後で確認したいことも多いので

#save_ipythonlog.py

import os
def savelog(globals, dir=r"c:\your\ipythonlogdirctory", filename=None):
    '''
    usage :
        from save_ipythonlog import savelog
        savelog(globals())
    '''
    if not filename:
        import datetime
        filename = "ipythonlog_%s.txt" % datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    In = globals.get("In")
    Out = globals.get("Out")
    wf = open(os.path.join(dir, filename), "w")

    for n, i in enumerate(In):
        wf.write(str(i))
        if Out.get(n):
            wf.write("#%s\n" % str(Out.get(n)).replace("\n", "\n#"))
        wf.write("\n")
    wf.close()

のようなコードを作ってIPython上で

from save_ipythonlog import savelog
savelog(globals())

とやって保存しています。

これで決めたディレクトリに ipythonlog_20080131_201054.txt のような名前で以下のように保存されます。

_ip.magic("ed save_ipythonlog.py")

from bbs.models import *

print Entry.objects.all()

Entry.objects.all()
#[<Entry: dai
#
#
#>, <Entry: だよね>, <Entry: ねね
#
#>, <Entry: だだf
#
#>, <Entry: だふぁだf>, <Entry: だふぁふぁ>, <Entry: 1
#
#>, <Entry: 2
#
#>, <Entry: ああい
#だだ
#
#だd>]

savelog(globals())

Outは変数などの中身を記録するだけなので、上の例のようにprint文などは記録されません。

Outの部分はコメントアウトしてるので余計な部分を消せばそのままPythonのコードに使えます。

普通のログ機能を使いこなせればいいのだろうけど、現状はこれで間に合ってます。