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 ?
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!