2010-11-26 7 views
5

Quiero rastrear las líneas de un script de python a medida que se ejecutan. Sin embargo, el programa que uso necesita imprimir cosas para stdout. La opción de rastreo del módulo de rastreo python los imprime en stdout. ¿No está bien decir que no los imprima en stdout, sino que los guarde en un archivo? Intenté configurar el parámetro outfile, pero no detiene la impresión de líneas de rastreo.Módulo de rastreo de Python: trace las líneas a medida que se ejecutan, pero guárdelas en el archivo, en lugar de stdout

Respuesta

2

Puede copiar el código del módulo de rastreo y realizar algunos cambios para que escriba su salida en un archivo de su elección. Hay cinco declaraciones print entre las líneas 600 y 650 que son las que desea cambiar. Dado que no es necesario para que sea demasiado bonita, puede agregar a este hasta el final del archivo:

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

y cambiar las declaraciones de impresión por lo que este:

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

se convierte en esto:

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

Según los documentos del módulo de rastreo, el archivo de salida solo se usa para escribir la información de recuento actualizada.

módulo de seguimiento continuará para imprimir la información de rastreo en la salida estándar.

Para un seguimiento manual, si hay una función de entrada, he usado sys.settrace para hacer el trabajo de rastrear los flujos de llamadas. Se puede extender para rastrear línea por línea. Siempre puede archivar la información en un archivo en lugar de imprimirlo en stdout.

Una estructura simple es

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 y localtrace son funciones de devolución de llamada que se llaman con el evento - "por qué"

decir por caso cuando una función se llama, puede extraer la información de los detalles del marco.

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 

He publicado todos los detalles here.

+0

¿Existe algún otro/otro módulo que pueda guardar los datos de rastreo en un archivo? – Rory

+0

@Rory: ¿Cómo está rastreando la ejecución?¿Qué línea de comando estás usando? He usado el trazado manual antes, modificando la salida a mi gusto. – pyfunc

0

Puede suceder que necesite el llamado 'rastro de función' described for PHP. Creé Python tool que produce un resultado similar al mencionado por pyfunc sys.settrace() hook.

0

¿Está invocando rastreo en la línea de comando? Si es así, recomiendo usar el método estándar de redirigir cualquier extensión a cualquier archivo. Redirect all output to file

foo > allout.txt 2>&1 

Estoy seguro de que Windows tiene algo similar si estás en ventanas.

Cuestiones relacionadas