python - захватывает stderr подпроцессов с помощью их stdout оболочки - PullRequest
1 голос
/ 23 марта 2011

Вот что я пытаюсь сделать:

-python process captures stderr of multiple subprocesses to watch the subprocesses
-each subprocess runs on the separate window displaying stdout. 

Когда я использую Popen ( команда , stderr = fp4tempfile ) ,

(good) the python process can capture stderr of the subprocesses
(bad ) the subprocess shells stop displaying stdout.

Когда я использую Popen ( команда ) ,

(good) each subprocess shells displays stdout (as well as stderr, which does not matter for me), 
(bad ) the python process cannot capture stderr. 

Я хочу оба "хороших". Что я могу сделать для этого? Заранее спасибо. (в настоящее время я использую python3.2 для разработки в Windows7)

Вот исходный код родительского процесса, написанный на python:

import os,subprocess
import time
fpws = []
fprs = []

def run_command(command):
    <specifying a file to write -- skipped>
    fpw = open(ftempname,'w')
    fpr = open(ftempname,'r')
    #cmd_redirect = "%s 2>%s" % (command,ftempname)#didnt do anything
    #starting a sub-program:
    pp = subprocess.Popen(command,stderr = fpw) #++
    #pp = subprocess.Popen(command)             #@@
    fpws.append(fpw)
    fprs.append(fpr)    

def watch_program():
    while True: #running forever for simplfication
        for fpr in  fprs:
            outchunk = fpr.read()
            <do something for subprocesses stderr -- skipped>
            time.sleep(1.0)

if __name__ == '__main__':
    cmd1 = '(path to program1)'
    cmd2 = '(path to program2)'
    run_command(cmd1)  #kicking cmd1
    run_command(cmd2)  #kicking cmd2
    watch_program()          #hearing stderr msg from the other process

Примечание: на стороне подпроцесса fflush (stdout) и fflush (stderr) вызываются по мере необходимости.

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

I82Много, спасибо за ваш ответ и комментарий.

Да, ваш комментарий о stderr был абсолютно верным. Я разрабатывал в Windows7. В Linux (Ubuntu10) просто сработало следующее:

    cmd_line4sub = command + ' 2> ' + ftempname
    pp = subprocess.Popen(['/usr/bin/xterm','-e',cmd_line4sub],stderr = fpw)

Открываются новые оболочки, выводится стандартный вывод подпроцесса. Родительский процесс перехватывает подпроцесс stderr. Это моя первая цель.

Если я когда-нибудь смогу понять, как это сделать в Windows, я выложу свой ответ;)

(я тот же пользователь, что и спрашивающий, но я не могу создать для них ту же учетную запись ...)

0 голосов
/ 24 марта 2011

Не проверял это, но вы можете сделать

import sys

pp = subprocess.Popen(command, stderr = fpw, stdout = sys.stdout)
...