2010-11-26 46 views
5

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

2

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)), 
2

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.

+0

Existe-t-il un module/un autre module pouvant enregistrer les données de trace dans un fichier? – Rory

+0

@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

0

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().

0

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.