如何捕获子进程的标准输出(stdout)输出?

12

我正在尝试用Python编写程序,被告知需要运行一个.exe文件。当运行该.exe文件时,它会输出大量数据,而我需要将某一行打印到屏幕上。我相当确定我需要使用subprocess.popen或类似的东西,但我对此一窍不通。是否有一种简单的方法让我完成这个任务?

2个回答

28

如果你想在进程执行完之后打印输出,@Paolo的解决方案非常完美。如果你想在进程运行时轮询输出,则需要按照以下方式进行:

process = subprocess.Popen(cmd, stdout=subprocess.PIPE)

while True:
    out = process.stdout.readline(1)
    if out == '' and process.poll() != None:
        break
    if out.startswith('myline'):
        sys.stdout.write(out)
        sys.stdout.flush()

1
这里的 myline 是什么? - Hamza Rashid
楼主说:“我需要将某一行打印到屏幕上”,myline只是一个例子。这部分代码是用来确定要打印的特定输出行的位置。 - Alex

22

就像这样:

import subprocess
process = subprocess.Popen(["yourcommand"], stdout=subprocess.PIPE)
result = process.communicate()[0]

我该如何读取某一行?就是0的位置吗?是的,我想在进程完成后打印输出。 另外,在“yourcommand”的位置,是否需要加上exe扩展名? - Tyler
1
"result"将是“yourcommand”的全部输出。然后,您可以处理该字符串(或Py3.0中的字节对象)以找到您要查找的行。 - Dietrich Epp
3
[0] 表示返回的元组(stdout,stderr)中的第一个元素;您可以对结果进行处理,它将是一个字符串,例如查找特定行。 "yourcommand" 是您的完整命令,最终是命令的完整路径,如果该命令不在* path 上(至少在nix上)。 - miku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接