代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

Python跟踪模块-跟踪执行时的行,但保存到文件,而不是stdout

  •  6
  • Amandasaurus  · 技术社区  · 14 年前

    我想在执行python脚本时跟踪它们的行。但是我使用的程序需要打印一些东西到stdout。python跟踪模块的trace选项将它们打印到stdout。有没有办法告诉它不要把它们打印到stdout,而是把它们保存到一个文件中?我试着设置 outfile 参数,但它不会停止打印跟踪线。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Ned Batchelder    14 年前

    您可以复制跟踪模块代码,并进行一些更改,使其将输出写入您选择的文件。有五个 print 您要更改的第600行和第650行之间的语句。既然你不需要把它做得太漂亮,你可以把它加到文件的最后:

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

    并更改打印语句,以便:

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

    变成:

    print >>my_out_file, "%s(%d): %s" % (bname, lineno,
                          linecache.getline(filename, lineno)),
    
        2
  •  3
  •   pyfunc    14 年前

    根据跟踪模块的文档,输出文件仅用于写入更新的计数信息。

    跟踪模块将继续将跟踪信息打印到stdout。

    对于手动跟踪,如果有entry函数,我使用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是回调函数,通过事件“why”调用

    例如,当调用函数时,可以从帧详细信息中提取信息。

    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 .

        3
  •  0
  •   anatoly techtonik Tony    11 年前

    可能需要所谓的“函数跟踪” described for PHP . 我创造了 Python tool 它使用pyfunc sys.settrace()钩子所提到的方法生成类似的输出。

        4
  •  0
  •   Community CDub    8 年前

    您是在命令行调用trace吗?如果是,我建议使用标准方法将任何stdout重新路由到任何文件。 Redirect all output to file

    foo > allout.txt 2>&1
    

    如果你在windows里,我肯定windows也有类似的东西。