Est-il un moyen de sondage un descripteur de fichier retourné de subprocess.Popen?
-
22-08-2019 - |
Question
Dire que j'écris ceci:
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Et si je fais
line = p.stdout.readline()
mon programme attend jusqu'à ce que le sous-processus émet la ligne suivante.
Y at-il magique que je peux faire pour p.stdout
pour que je puisse lire la sortie si elle est là, mais juste continuer autrement? Je cherche quelque chose comme Queue.get_nowait()
Je sais que je peux créer un fil pour la lecture p.stdout
, mais supposons que je ne peux pas créer de nouvelles discussions.
La solution
Utilisez le module select
dans la bibliothèque standard de Python, consultez http://docs.python.org/ bibliothèque / select.html. select.select([p.stdout.fileno()], [], [], 0)
retourne immédiatement un tuple dont les éléments sont trois listes:. le premier va être vide s'il y a quelque chose à lire sur ce descripteur de fichier
Autres conseils
Utilisez p.stdout.read(1)
ce lira caractère par caractère
Et voici un exemple complet:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()