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

Patricia Arquette
Libérer: 2024-11-27 06:04:14
original
351 Les gens l'ont consulté

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)
Copier après la connexion

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()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal