使用 Popen 将所有内容输出到一个流中

Using Popen to output everything in one stream

我在尝试让子进程执行我希望它执行的操作时遇到了一些问题。我有一个接受输入文件的测试工具。 testtool.exe -f 并在命令提示符中 运行 时产生这样的输出。

12:30:46 INFO  Output- Processing arguments
12:30:46 INFO  Output- Arguments ok
12:30:46 INFO  Output- Doing something
12:30:46 INFO  Output- More Stuff
12:30:03 ERROR Output- Error found
12:30:03 INFO  Output- Finished
12:30:03 INFO  Output- Exiting

所以我在 python Python 3.4.3 中尝试使用子进程来 运行 这个工具。例如...

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True).communicate()[0].decode('utf-8')
for i in proc.splitlines():
    print("> {0}".format(i))

很遗憾,输出不包含 'ERROR' 行。我想完全按照从命令提示符获取输出的方式获取输出,因为我需要对其进行额外的验证。例如出现了多少错误行,它们出现在输出中的什么位置。因此,将 ERROR 和 INFO 行拆分为不同的流不适合我。

> 12:30:46 INFO  Output- Processing arguments
> 12:30:46 INFO  Output- Arguments ok
> 12:30:46 INFO  Output- Doing something
> 12:30:46 INFO  Output- More Stuff
> 12:30:03 INFO  Output- Finished
> 12:30:03 INFO  Output- Exiting

我也试过了

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=STDOUT, shell=True).communicate()[0].decode('utf-8')

这是我最新的转世..

    proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    proc_data = proc.communicate()

    for i in proc_data[0].splitlines():
        print ("INFO> {0}".format(i))

    for i in proc_data[1].splitlines():
        print ("ERROR> {0}".format(i))

此外,ERROR 行从未出现。好像迷路了?

知道了!这是我建立命令的方式的结果,我是 运行。命令在一行中包含 exe 和 args。

command = "testtool.exe -f <filename>"
proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)

这个 运行 工具,但由于某种原因没有产生我预期的错误。当我重新格式化以下代码片段时,出现了预期的错误。

proc = subprocess.Popen([testtool.exe, -f <filename>], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)