2016-07-20 10 views
0

私は、各要求 - 応答サイクルで呼び出されたすべての関数を格納して保存する必要があるプロジェクトを開発しています。変数の値を格納する必要はありません。格納する必要があるのは、パラメータとその実行順序で呼び出された関数だけです。私はmongodbを使ってこのトレースを保存しています。Pythonプログラムの実行フロー(関数呼び出しフロー)を格納する

+3

['sys.settrace'](https://docs.python.org/2/library/sys.html#sys。 settrace)関数を使用して、ニーズに合っているかどうかを確認します。 – jedwards

+1

['logging'](https://docs.python.org/3/library/logging.html)モジュールを使用しない理由は何ですか? – Alex

答えて

1

便宜上、関数デコレータを使用できます。

import functools 
import logging 

def log_me(func): 
    @functools.wraps(func) 
    def inner(*args, **kwargs): 
     logging.debug('name: %s, args: %s, kwargs: %s', func.__name__, args, kwargs)           
     return func(*args, **kwargs) 
    return inner 

次に、機能をログに記録してください。

@log_me 
def test(x): 
    return x + 2 

テストコール。

In [10]: test(3) 
DEBUG:root:name: test, args: (3,), kwargs: {} 
Out[10]: 5 

あなたはlogging moduleにはMongoDBのエントリ代わりに、直接の最初のログを保存したい場合は、データベース内のエントリを作成するコードとlogging.debug行を置き換えることができます。

0

sys.settraceは、デバッグのための機能をトレースしますが、この問題を修正することができます。たぶんthisのようなもの -

import sys 

def trace_calls(frame, event, arg): 
    if event != 'call': 
     return 
    co = frame.f_code 
    func_name = co.co_name 
    if func_name == 'write': 
     # Ignore write() calls from print statements 
     return 
    func_line_no = frame.f_lineno 
    func_filename = co.co_filename 
    caller = frame.f_back 
    caller_line_no = caller.f_lineno 
    caller_filename = caller.f_code.co_filename 
    print 'Call to %s on line %s of %s from line %s of %s' % \ 
     (func_name, func_line_no, func_filename, 
     caller_line_no, caller_filename) 

profilingを参照してください。プログラムのさまざまな部分が実行された頻度と時間について説明します

関連する問題