Maison >développement back-end >Tutoriel Python >Comment puis-je dupliquer le sys.stdout de Python dans un fichier journal en mode interactif et démon ?

Comment puis-je dupliquer le sys.stdout de Python dans un fichier journal en mode interactif et démon ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-01 12:23:11734parcourir

How Can I Duplicate Python's sys.stdout to a Log File in Both Interactive and Daemon Modes?

Dupliquer sys.stdout dans un fichier journal

Dupliquer sys.stdout dans un fichier journal vous permet de capturer toutes les sorties, y compris les appels système , à partir d'une application Python. Malgré sa simplicité, cette tâche pose un défi unique lorsque l'application fonctionne à la fois en mode interactif et en mode démon.

Mode interactif ou mode démon

En mode interactif, vous souhaitez à la fois l'écran et un fichier journal pour recevoir la sortie. Cependant, en mode démon, toutes les sorties doivent être dirigées vers le fichier journal. La fonction os.dup2() fonctionne bien pour rediriger la sortie en mode démon, mais elle ne fournit pas de solution simple pour dupliquer la sortie en mode interactif sans modifier les appels système.

Duplication à l'aide de Tee

Pour surmonter ce problème, vous pouvez utiliser la classe Tee, qui permet de dupliquer la sortie standard dans un fichier journal. Voici un exemple :

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 vous permet de créer une instance Tee qui prend un nom de fichier journal et un mode comme paramètres. La méthode write() duplique la sortie à la fois dans le fichier journal et sur la sortie standard.

Exemple d'implémentation

Pour utiliser la classe Tee :

with Tee('logfile.txt', 'w') as tee:
    print('Hello world!')
    os.system('ls -la')

Dans cet exemple, toutes les sorties, y compris l'appel système à « ls -la », seront écrites à la fois sur l'écran et dans le fichier journal. 'logfile.txt'.

Cette solution enregistre efficacement toutes les sorties, y compris les sorties des appels système, sans qu'il soit nécessaire de modifier les appels système individuels.

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