Maison >développement back-end >Tutoriel Python >Comment puis-je simultanément capturer et enregistrer la sortie en direct d'un sous-processus en Python ?

Comment puis-je simultanément capturer et enregistrer la sortie en direct d'un sous-processus en Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-25 22:39:10551parcourir

How Can I Simultaneously Capture and Log Live Output from a Subprocess in Python?

Sortie en direct de la commande de sous-processus

Lors de l'utilisation de subprocess.Popen pour exécuter des commandes externes, il devient difficile d'obtenir à la fois la diffusion en direct et la sortie stockage pour la journalisation et la vérification des erreurs. Cet article explore les techniques permettant de résoudre ce problème, en proposant des solutions qui capturent et affichent simultanément la sortie en temps réel tout en conservant la possibilité de l'écrire dans un fichier journal.

Solution 1 : approche basée sur les itérateurs

Une méthode consiste à créer un itérateur à partir de la fonction de lecture et à écrire la sortie à la fois dans la sortie standard et dans un journal. fichier :

import subprocess
import sys

with open("log.txt", "wb") as f:
    process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
    for c in iter(lambda: process.stdout.read(1), b""):
        sys.stdout.buffer.write(c)
        f.buffer.write(c)

Dans Python 3, remplacez "w" par "wb" pour prendre en charge l'écriture binaire.

Solution 2 : approche de fichier lecteur et écrivain

Alternativement, un fichier lecteur et écrivain peut être utilisé pour séparer la sortie standard et le fichier. écriture :

import io
import subprocess
import sys

filename = "log.txt"
with io.open(filename, "wb") as writer, io.open(filename, "rb", 1) as reader:
    process = subprocess.Popen(command, stdout=writer)
    while process.poll() is None:
        sys.stdout.write(reader.read())
        time.sleep(0.5)
    # Read the remaining
    sys.stdout.write(reader.read())

Cette méthode garantit que les données sont écrites à la fois dans la sortie standard et dans le fichier journal, tout en offrant l'avantage de la lecture et de l'écriture asynchrones.

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