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

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

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 21:58:15186parcourir

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

Imprimer la sortie en direct tout en stockant la sortie de la commande du sous-processus

Lors de l'appel d'un sous-processus à l'aide de subprocess.Popen, nous pouvons simultanément stocker sa sortie à des fins de journalisation et l'afficher en direct sur le terminal.

Solutions possibles

Option 1 : Utiliser Itérateurs

import subprocess
import sys

with open("test.log", "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)

Option 2 : Utiliser un lecteur et un écrivain

import io
import time
import subprocess
import sys

filename = "test.log"
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())

Option 3 : Solution personnalisée

ret_val = subprocess.Popen(run_command,
                            stdout=log_file,
                            stderr=subprocess.PIPE,
                            shell=True)
while not ret_val.poll():
    log_file.flush()

Dans un autre terminal, exécutez :

tail -f log.txt

Avec ceux-ci méthodes, vous pouvez capturer la sortie du sous-processus tout en l'affichant en direct, garantissant à la fois la journalisation et le suivi de la progression.

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