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!