Redirection et duplication de la sortie vers un fichier journal
Vous aspirez à obtenir la fonctionnalité de l'utilitaire de ligne de commande 'tee', où toutes les sorties généré par votre application Python, y compris la sortie de l'appel système, est dupliqué dans un journal file.
Redirection
Votre approche initiale impliquait la duplication des descripteurs de fichier de sys.stdout et sys.stderr vers le fichier journal, qui redirige avec succès la sortie vers la connexion mode démon. Cependant, cette méthode ne fonctionne pas en mode interactif car elle entrave l'affichage simultané de la sortie à l'écran.
Duplication
Pour réaliser la duplication, il suffit d'inverser les appels dup2. pas suffisant. Au lieu de cela, vous pouvez utiliser une technique qui intercepte sys.stdout et duplique les données écrites à la fois sur l'écran et dans le fichier journal.
Solution
L'extrait ci-dessous fournit un solution élégante :
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 encapsule la duplication du descripteur de fichier et offre un moyen transparent d'écrire dans les deux sys.stdout et le fichier journal. Vous pouvez initialiser une instance de Tee et transmettre les détails du fichier journal sous forme d'arguments. L'instance devient alors le nouveau sys.stdout.
Conclusion
En utilisant cette méthode, vous pouvez réaliser à la fois la redirection (en mode démon) et la duplication (en mode interactif ) de toutes les sorties de l'application, y compris les sorties des appels système, dans un fichier journal.
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!