2010-11-26 9 views
5

pythonスクリプトが実行されると、その行をトレースします。しかし、私が使用するプログラムは、標準出力に物事を印刷する必要があります。 pythonトレースモジュールのトレースオプションは、それらをstdoutに出力します。それをstdoutに出力しないように伝えるのに、ファイルに保存するのはどうですか? outfileパラメータを設定しようとしましたが、トレース行の印刷を停止しません。Pythonトレースモジュール - 実行時の行をトレースしますが、標準出力ではなくファイルに保存します

答えて

2

トレースモジュールのコードをコピーし、いくつか変更して、選択したファイルに出力を書き込むことができます。変更したい行600と650の間に5つのprint文があります。

my_out_file = open("/home/mytrace.txt", "w") 

と、このようにprint文を変更します:あなたは、ファイルの最後にこれを追加することができ、それはあまりにもきれいにする必要はありませんので

print "%s(%d): %s" % (bname, lineno, 
         linecache.getline(filename, lineno)), 

はこのようになります。

print >>my_out_file, "%s(%d): %s" % (bname, lineno, 
         linecache.getline(filename, lineno)), 
2

トレースモジュールのドキュメントごとに、outfileは更新されたカウント情報を書き込むためにのみ使用されます。

トレースモジュールは、stdoutにトレース情報を印刷していきます。

手動トレースの場合、エントリ関数がある場合は、sys.settraceを使用してコールフローをトレースする作業を行いました。行ごとにトレースするように拡張することができます。情報をstdoutに出力するのではなく、いつでもファイルに保存することができます。

シンプルな構造は、

import sys 
import os 
import linecache 

trace_depth = 0 

def trace(f): 

    def globaltrace(frame, why, arg): 
     global trace_depth 
     if why == "call": 
      # function call event , extract information 
      ..... 
      pass 

      trace_depth = trace_depth + 1 
     return None 

    def localtrace(frame, why, arg): 
     global trace_depth 
     if why == "line": 
      # line execution event 
      pass 
     elif why == "return": 
      trace_depth = trace_depth - 1 
      # function return event 
     return localtrace 

    def _f(*args, **kwds): 
     sys.settrace(globaltrace) 
     result = f(*args, **kwds) 
     sys.settrace(None) 
     return result 

    return _f 

globaltraceとlocaltraceがイベントで呼び出され、コールバック関数ですです - ときに関数 "なぜ"

がイベントのために言いますフレームの詳細から情報を抽出することができます。

if why == "call": 
    # Parent frame details 
    p_func = frame.f_back.f_code.co_name 
    p_file = frame.f_back.f_code.co_filename 
    p_lineinfo = frame.f_back.f_lineno 

私は完全な詳細hereを投稿しました。

+0

トレースデータをファイルに保存できるとにかく/他のモジュールはありますか? – Rory

+0

@Rory:どのように実行をトレースしていますか?どのコマンドラインを使用していますか?以前は手動トレースを使用していましたが、出力を自分の好みに合わせて修正しました。 – pyfunc

0

いわゆる「機能トレース」described for PHPが必要になることがあります。私はPython toolを作成し、これはpyfunc sys.settrace()フックで説明したものと同様の出力を生成します。

0

コマンドラインでtraceを呼び出していますか?もしそうなら、私はstdoutをどのファイルにも再ルーティングする標準的な方法を使用することを推奨します。 Redirect all output to file

foo > allout.txt 2>&1 

私はあなたが窓にいる場合、Windowsは、同様の何かを持っていると確信しています。

関連する問題