2012-10-14 3 views
2

(en Python 3.2 actuellement)Capture et sortie stderr en même temps avec le sous-processus de python

je dois pouvoir:

  • exécuter une commande à l'aide de sous-processus
  • deux stdout/stderr cette commande doit être imprimée au terminal en temps réel (peu importe si elles sortent toutes les deux sur stdout ou stderr ou autre
  • En même temps, j'ai besoin d'un moyen de savoir si la commande a imprimé quelque chose à stderr (et de préférence ce qu'il a imprimé)

J'ai joué avec des tuyaux sous-processus, ainsi que faire conduite étrange dans réoriente bash, ainsi que l'utilisation tee, mais pour l'instant n'a rien trouvé qui fonctionnerait. Est-ce quelque chose qui est possible?

Répondre

1

Ma solution:

import subprocess 

process = subprocess.Popen("my command", shell=True, 
          stdout=None, # print to terminal 
          stderr=subprocess.PIPE) 
duplicator = subprocess.Popen("tee /dev/stderr", shell=True, # duplicate input stream 
           stdin=process.stderr, 
           stdout=subprocess.PIPE, # catch error stream of first process 
           stderr=None) # print to terminal 
error_stream = duplicator.stdout 
print('error_stream.read() = ' + error_stream.read()) 
0

Essayez quelque chose comme ceci:

import os 

cmd = 'for i in 1 2 3 4 5; do sleep 5; echo $i; done' 
p = os.popen(cmd) 

while True: 
    output = p.readline() 
    print(output) 
    if not output: break 

En python2 vous pouvez attraper facilement stderr aussi bien en utilisant popen3 comme ceci:

i, o, err = os.popen3(cmd) 

mais il ne semble pas exister une telle fonction dans python3. Si vous ne trouver le moyen de contourner cela, essayez d'utiliser directement subprocess.Popen, comme décrit ici: http://www.saltycrane.com/blog/2009/10/how-capture-stdout-in-real-time-python/

Questions connexes