p = Popen(cmd, bufsize=1024,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
p.stdin.close()
print p.stdout.read() #This will print the standard output from the spawned process
print p.stderr.read() #This is what you need, error output <-----
Таким образом, в основном вывод ошибок перенаправляется на stderr
Pipe.
Если вам нужно что-то большее в реальном времени. Я имею в виду, что строки печатаются, как только порожденный процесс печатает что-то в stdout or
stderr`, тогда вы можете сделать что-то вроде:
def print_pipe(type_pipe,pipe):
for line in iter(pipe.readline, ''):
print "[%s] %s"%(type_pipe,line),
p = Popen(cmd, bufsize=1024,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
t1 = Thread(target=print_pipe, args=("stdout",p.stdout,))
t1.start()
t2 = Thread(target=print_pipe, args=("stderr",p.stderr,))
t2.start()
#optionally you can join the threads to wait till p is done. This is avoidable but it
# really depends on the application.
t1.join()
t2.join()
В этом случае два потока будут печататься каждый раз, когда строка записывается в stdout
или stderr
. Параметр type_pipe
просто делает различие, когда строки печатаются, чтобы знать, исходят ли они из stderr
или stdout
.