8
votes

Module de trace Python - Lignes de trace tels qu'ils sont exécutés, mais enregistrez-le dans le fichier, plutôt que de stdout

Je veux suivre les lignes d'un script Python comme ils sont exécutés. Toutefois, le programme que j'utilise doit imprimer des choses à l'égard. L'option de trace au module de trace Python les imite à stdout. Y a-t-il un anwyay pour lui dire de ne pas les imprimer à STDOUT, mais sauvez-les dans un fichier? J'ai essayé de définir le paramètre Outfile , mais cela n'arrête pas l'impression de lignes de trace.


0 commentaires

5 Réponses :


3
votes

Selon les documents du module de trace, la tenue est utilisée uniquement pour rédiger des informations de comptage mises à jour.

  • http://docs.python.org/library/trace.html < / li>

    trace module continuera à imprimer les informations de trace à stdout.

    pour un traçage manuel, s'il y a une fonction d'entrée, j'ai utilisé SyS.SetTrace pour faire le travail de traçage flux d'appels. Il peut être étendu à la ligne de trace par exécution de la ligne. Vous pouvez toujours déposer les informations à un fichier plutôt que d'imprimer sur stdout.

    • http://docs.python.org/library/sys.html < / li>

      une structure simple est xxx

      GlobalTrace et localTrace sont des fonctions de rappel qui sont appelées avec l'événement - "Pourquoi"

      dire Pour l'événement Lorsqu'une fonction est appelée, vous pouvez extraire les informations des détails de l'image. xxx

      J'ai posté les détails complets ici .


3 commentaires

Y a-t-il de toute façon / autre module pouvant enregistrer les données de trace dans un fichier?


@Rory: Comment tracez-vous l'exécution? Quelle commande utilisez-vous? J'ai déjà utilisé le traçage manuel, modifier la sortie à mon goût.


Merci pour votre réponse. Ceci est beaucoup de code. Y a-t-il une bibliothèque maintenue qui pourrait aider ici?



6
votes

Vous pouvez copier le code de module de trace et faire quelques modifications pour l'obtenir pour écrire sa sortie dans un fichier de votre choix. Il y a cinq relevés d'impression code> entre les lignes 600 et 650 qui sont ceux que vous souhaitez modifier. Puisque vous n'avez pas besoin de le faire trop jolie, vous pouvez ajouter ceci à la fin du fichier: xxx pré>

et modifier les instructions d'impression afin de: P>

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


1 commentaires

Au cas où cela se bloque, vous devriez probablement activer tampon de ligne ouvert (..., tampon = 1)



0
votes

Il peut arriver que vous ayez besoin de "trace de fonction" décrit pour php . J'ai créé outil Python qui produit une sortie similaire en utilisant mentionné par Pyfuncy Sys.SetTrace ().


0 commentaires

0
votes

Appliquez-vous de la trace à la ligne de commande? Si tel est le cas, je recommande d'utiliser la méthode standard de rétablissement de tout stdout à n'importe quel fichier. Rediriger toute sortie au fichier

foo > allout.txt 2>&1


1 commentaires

Je pense que OP souhaitait que le stdout du programme soit toujours à l'endroit habituel.



0
votes

Une autre possibilité lorsque vous utilisez stdout / stardr pour quelque chose d'autre consiste à démarrer un Fil Pour écrire et nourrir des messages à un Queue

Q.put("some message")


0 commentaires