Maison  >  Article  >  développement back-end  >  Comment dupliquer le sys.stdout de Python dans un fichier journal, y compris la sortie de l'appel système ?

Comment dupliquer le sys.stdout de Python dans un fichier journal, y compris la sortie de l'appel système ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-27 06:04:14353parcourir

How to Duplicate Python's sys.stdout to a Log File, Including System Call Output?

Duplication de sys.stdout dans un fichier journal

Dans cette énigme de programmation, l'objectif est de dupliquer toutes les sorties d'une application Python, y compris sortie de l'appel système, dans un fichier journal séparé. Cependant, cette tâche s'est avérée difficile pour l'utilisateur.

Au départ, l'utilisateur a tenté une solution en inversant l'ordre des appels dup2, mais en vain. Le code ci-dessous démontre leur tentative infructueuse :

import os, sys

so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

Avec cette approche, le fichier "a.log" aurait dû contenir la même sortie que celle affichée à l'écran, mais ce n'est pas le cas.

Solution

Heureusement, il existe une solution à ce problème. Le code ci-dessous fournit une classe appelée Tee qui duplique avec succès sys.stdout dans un fichier journal spécifié :

class Tee(object):
    def __init__(self, name, mode):
        self.file = open(name, mode)
        self.stdout = sys.stdout
        sys.stdout = self
    def __del__(self):
        sys.stdout = self.stdout
        self.file.close()
    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)
    def flush(self):
        self.file.flush()

Cette classe permet à l'utilisateur de créer une instance Tee et de spécifier le nom et le mode du fichier journal. Par la suite, sys.stdout est redirigé vers l'instance Tee, dupliquant efficacement toutes les sorties dans le fichier journal tout en préservant la sortie à l'écran.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn