Python lit les sous-processus stdout et stderr séparément tout en préservant l'ordre
J'ai un python sous-processus que je suis en train de lire la sortie d'erreur et de flux. Actuellement, j'ai ça, mais je suis seulement en mesure de lire le stderr
après que j'ai terminé la lecture de stdout
. Voici à quoi il ressemble:
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout_iterator = iter(process.stdout.readline, b"")
stderr_iterator = iter(process.stderr.readline, b"")
for line in stdout_iterator:
# Do stuff with line
print line
for line in stderr_iterator:
# Do stuff with line
print line
Comme vous pouvez le voir, le stderr
pour la boucle ne peut pas commencer jusqu'à ce que le stdout
boucle est terminée. Comment puis-je modifier cela pour être en mesure de lire à la fois dans le bon ordre les lignes?
À préciser: j'ai encore besoin d'être capable de dire si une ligne est venu de stdout
ou stderr
parce qu'ils seront traités différemment dans mon code.
source d'informationauteur Luke Sapan
Vous devez vous connecter pour publier un commentaire.
Le code dans votre question peut impasse si le processus de l'enfant produit assez de sortie sur la sortie stderr (~100KO sur ma machine Linux).
Il y a un
communicate()
méthode qui permet de lire à partir de deux stdout et stderr séparément:Si vous avez besoin de lire le flux de tout le processus de l'enfant est toujours en cours d'exécution, puis la solution portable est d'utiliser des threads (pas testé):
Voir:
L'ordre dans lequel un processus écrit des données dans les différents tuyaux est perdu après l'écriture.
Il n'y a aucun moyen de savoir si la sortie standard (stdout) a été écrit avant la sortie stderr.
Vous pouvez essayer de lire des données simultanément à partir de plusieurs descripteurs de fichiers de manière non-bloquante
dès que les données sont disponibles, mais cela ne ferait que réduire la probabilité que la commande est incorrecte.
Ce programme doit le démontrer:
et sorties à quelque chose comme ceci:
J'ai écrit quelque chose à ce faire un il y a longtemps. Je n'ai pas encore porté sous Python 3, mais il ne devrait pas être trop difficile (plaques acceptées!)
Si vous exécutez seul, vous verrez beaucoup de différentes options. Dans tous les cas, il permet de distinguer stdout de stderr.
Selon python doc
Ci-dessous échantillon pouvez faire ce que vous voulez
test.py
printer.py
De sortie: