J'ai un travail assez long, qui s'exécute pendant plusieurs minutes puis est redémarré. La tâche génère diverses informations que je capture comme ceci:
output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate()
Le fait est que je n'obtiendrai que la sortie entière à la fois. Je voudrais afficher la sortie lorsque le programme l'envoie à stdout, tout en la repoussant dans un tampon (j'ai besoin de vérifier la sortie pour la présence de certaines chaînes). En Ruby, je le ferais comme ceci:
IO.popen(cmd) do |io|
io.each_line do |line|
puts line
buffer << line
end
end
3 réponses
Vous pouvez essayer quelque chose comme ceci:
cmd = ["./my_program.sh"]
p = subprocess.Popen( cmd, shell=False, stdout=subprocess.PIPE) # launch the process
while p.poll() is None: # check if the process is still alive
out = p.stdout.readline() # if it is still alive, grab the output
do_something_with(out) # do what you want with it
Vous pouvez le lire une ligne à la fois:
from subprocess import Popen, PIPE
p = Popen('grep -ir graph .', stdout=PIPE)
while not p.returncode:
s = p.stdout.readline()
print s
p.poll()
De cette façon, vous ne bloquez que le temps nécessaire pour traiter la sortie d'une seule ligne.
Vous pouvez utiliser la commande "tee". Il fait exactement ce dont vous avez besoin.
http://www.computerhope.com/unix/utee.htm
Questions connexes
Questions liées
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.