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
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)),
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.
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.
¿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.
- 1. módulo de rastreo de Python para principiantes
- 2. Saltar primer par de líneas, mientras que las líneas de lectura en el archivo Python
- 3. Cómo hacer que los scripts de shell robustos a la fuente se cambien a medida que se ejecutan
- 4. Scripts de perfiles de Python que se ejecutan en mod_wsgi
- 5. ¿Hay alguna manera de averiguar el nombre del archivo al que se redirige stdout en Python?
- 6. Contar el número de líneas en un archivo txt con Python excluyendo las líneas en blanco
- 7. Las secuencias de comandos que se ejecutan en jquery.ajax() páginas cargadas ejecutan document.ready demasiado pronto
- 8. ¿Cómo eliminar las líneas que aparecen en el archivo B de otro archivo A?
- 9. Subprocesos GAE python que no se ejecutan en paralelo
- 10. ¿Por qué solo se ejecuta la primera línea de este archivo por lotes de Windows pero las tres líneas se ejecutan en un shell de comandos?
- 11. Cambiar el archivo de Python en su lugar
- 12. ¿Es posible modificar líneas en un archivo en el lugar?
- 13. Reemplace las líneas nuevas, pero conserve las líneas en blanco
- 14. Rastreo de llamadas al cargar un módulo en Linux
- 15. UITableView: cómo mantener fijas las filas de la tabla a medida que el usuario se desplaza
- 16. ¿Cómo enviar la salida de rastreo a un archivo en el sistema de archivos?
- 17. Eliminar elementos a medida que atraviesan una lista en Python
- 18. Cómo configurar Fluidez NHibernate para enviar consultas a Trace o Debug en lugar de Console?
- 19. Función C que cuenta las líneas en el archivo
- 20. Salida de subproceso Python a stdout
- 21. Rails tareas de rake DB se ejecutan pero nunca salen
- 22. Las consultas de MySQL son rápidas cuando se ejecutan directamente pero realmente son lentas cuando se ejecutan como proc almacenado
- 23. En Python, ¿cómo se usa el módulo decimal en un script en lugar del intérprete?
- 24. Módulo Python para habilitar colores ANSI para stdout en Windows?
- 25. El módulo de subproceso de Python no devuelve stdout en segfault
- 26. ¿Cómo se representan las unidades de medida?
- 27. de objetos Python Importación que se origina en un módulo de un módulo diferente en un tercer módulo
- 28. Desactivar el rastreo a través de la aplicación.config
- 29. Cuándo se ejecutan las funciones de Javascript
- 30. ¿Cómo verificar las aplicaciones que se ejecutan actualmente en Android?
¿Existe algún otro/otro módulo que pueda guardar los datos de rastreo en un archivo? – Rory
@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