Je souhaite tracer les lignes d'un script python lors de leur exécution. Cependant, le programme que j'utilise doit imprimer les choses sur stdout. L'option de trace du module de trace python les affiche dans stdout. Y a-t-il moyen de lui dire de ne pas les imprimer sur stdout, mais de les sauvegarder dans un fichier? J'ai essayé de définir le paramètre outfile
, mais cela n'empêche pas l'impression des lignes de trace.Module de trace Python - Trace les lignes au fur et à mesure de leur exécution, mais sauvegarde dans un fichier plutôt que dans stdout.
Répondre
Vous pouvez copier le code du module de trace et apporter quelques modifications pour l'écrire dans un fichier de votre choix. Il y a cinq instructions print
entre les lignes 600 et 650 que vous voulez changer. Puisque vous n'avez pas besoin d'en faire trop jolie, vous pouvez ajouter à la fin du fichier:
my_out_file = open("/home/mytrace.txt", "w")
et modifier les instructions d'impression si ceci:
print "%s(%d): %s" % (bname, lineno,
linecache.getline(filename, lineno)),
DEVIENT ceci:
print >>my_out_file, "%s(%d): %s" % (bname, lineno,
linecache.getline(filename, lineno)),
Selon les documents du module de trace, le fichier de sortie est uniquement utilisé pour écrire les informations de compte mises à jour.
module Trace continuera d'imprimer les informations de trace sur la sortie standard.
Pour un traçage manuel, s'il y a une fonction d'entrée, j'ai utilisé sys.settrace pour faire le traçage des flux d'appels. Il peut être étendu pour suivre l'exécution ligne par ligne. Vous pouvez toujours classer les informations dans un fichier plutôt que de les imprimer sur stdout.
Une structure simple est
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 et localtrace sont fonctions de rappel qui sont appelés à l'événement - "pourquoi"
dire pour l'événement en fonction est appelé, vous pouvez extraire les informations à partir des détails du cadre.
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
J'ai posté les détails complets here.
Il peut arriver que vous ayez besoin de ce que l'on appelle 'trace de fonction' described for PHP. J'ai créé Python tool qui produit une sortie similaire en utilisant le crochet pyfunc sys.settrace().
Appelez-vous trace sur la ligne de commande? Si c'est le cas, je recommande d'utiliser la méthode standard de redirection de n'importe quel fichier stdout vers n'importe quel fichier. Redirect all output to file
foo > allout.txt 2>&1
Je suis sûr que windows a quelque chose de similaire si vous êtes dans les fenêtres.
Existe-t-il un module/un autre module pouvant enregistrer les données de trace dans un fichier? – Rory
@Rory: Comment tracez-vous l'exécution?Quelle ligne de commande utilisez-vous? J'ai déjà utilisé le traçage manuel, en modifiant la sortie à mon goût. – pyfunc