¿Cómo imprimir cada línea de un script como se ejecuta solo para el script de nivel superior que se está ejecutando?

El módulo de rastreo de Python le permitirá ejecutar un script imprimiendo cada línea de código, ya que se ejecuta tanto en el script como en todos los módulos importados de la siguiente manera:

python -m trace -trace myscript.py 

¿Hay alguna forma de hacer lo mismo, pero solo imprimir las llamadas de nivel superior, es decir, solo imprimir las líneas en myscript.py medida que se ejecutan?

Estoy tratando de depurar una falla de captura abortiva y no puedo averiguar dónde está muriendo. Desafortunadamente, el uso del --trace completo tarda una eternidad – la secuencia de comandos normalmente tarda de 2 a 3 minutos en ejecutarse, y el rastreo completo ha --trace horas.

Me encontré con este problema y encontré que grep era una solución rápida y sucia:

 python -m trace --trace my_script.py | grep my_script.py 

Sin embargo, mi script se ejecuta en tiempo finito. Esto probablemente no funcionará bien para scripts más complejos.

Tal vez lptrace pueda ser útil para ti.

No es exactamente lo que desea, pero puede considerar usar py.test con “-s” que evitará que py.test capture la salida de su estado de impresión … Así que puede poner un estado de impresión aquí y allá para cada función tiene en su script y cree una prueba ficticia que simplemente ejecuta su script como de costumbre … Entonces puede ver dónde falló.

Si no obtiene un rastreo, puede utilizar la técnica llamada bisección .

Edite la función principal o el cuerpo del script y coloque una llamada de exit(1) aproximadamente en el medio. Esta es la primera bisección.

Ejecuta tu guión. Si llega a su salida, sabrá que la falla está en la segunda mitad. Si no, está en la primera mitad.

Mueva la exit a la mitad de la primera mitad o la mitad de la segunda mitad e intente nuevamente.

Con cada ciclo, puede reducir la ubicación de la falla a la mitad del código restante.

Si lo ha reducido a una de sus propias funciones, bisecte eso.

Puede usar el decorador y decorar todas las funciones de su módulo dinámicamente (sin edición de cada función). Solo necesitas pegar estas líneas al final de tu script:

 def dump_args(func): """This decorator dumps out the arguments passed to a function before calling it""" argnames = func.func_code.co_varnames[:func.func_code.co_argcount] fname = func.func_name def echo_func(*args,**kwargs): print fname, "(", ', '.join( '%s=%r' % entry for entry in zip(argnames,args[:len(argnames)])+[("args",list(args[len(argnames):]))]+[("kwargs",kwargs)]) +")" return echo_func ### Decorate all the above functions import types for k,v in globals().items(): if isinstance(v, types.FunctionType): globals()[k] = dump_args(v) Reference, code is coming from these two answers : http://stackoverflow.com/questions/8951787/defining-python-decorators-for-a-complete-module http://stackoverflow.com/questions/6200270/decorator-to-print-function-call-details-parameters-names-and-effective-values