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
8
Geo 2 nov. 2011 à 13:04

3 réponses

Meilleure réponse

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
5
Cédric Julien 2 nov. 2011 à 09:21

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.

3
jro 2 nov. 2011 à 09:22

Vous pouvez utiliser la commande "tee". Il fait exactement ce dont vous avez besoin.
http://www.computerhope.com/unix/utee.htm

-1
x10 2 nov. 2011 à 09:25