使用子进程操作python stdout / stderr

时间:2014-01-31 19:23:24

标签: python subprocess

我正在尝试操纵/剥离7zip命令的输出和亲密用户关于进程的进度。我试图使用的示例代码如下:

import subprocess
proc = subprocess.Popen(['7zip','arg', 'archive'],shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if line != '':
    #Do some striping and update pyqt label
    print "test:", line.rstrip()
    sys.stdout.flush()
  else:
    break

然而,真正的问题是print语句仅在完成该过程后打印stdout。有没有办法逐行捕获stdout然后再操作和打印?

更新 更新了脚本以包含sys.stdout.flush()

1 个答案:

答案 0 :(得分:0)

是的,popen家族的电话。

您可以查看文档here

(child_stdin,
 child_stdout,
 child_stderr) = os.popen3("cmd", mode, bufsize)
==>
p = Popen("cmd", shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)

他们为您提供了文件描述符,您可以使用它们来读取被调用程序的输出。