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

时间:2017-03-22 13:33:16

标签: python subprocess popen

我在尝试让子进程执行我想要的操作时遇到了一些麻烦。我有一个测试工具,它接受一个输入文件。 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和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行永远不会出现。它就像在某处迷路一样?

1 个答案:

答案 0 :(得分:0)

知道了!这是我构建我正在运行的命令的方式的结果。命令包括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)