子进程输出到stdout和PIPE

时间:2012-03-25 10:28:40

标签: python-3.x subprocess

我正在使用subprocess模块:

ping = subprocess.Popen('fping.exe 192.168.2.3 196.65.58.69', stdout=PIPE)
output = ping.stdout.readlines()

我需要output列表以便稍后在程序中处理它,但似乎因为stdout被定向到PIPE它不会将结果输出到控制台。我想获得控制台输出(正在执行)和output列表。

我该怎么做?

我已经完成了搜索,得到了答案here,但我无法实现。

我在Windows环境中使用Python 3.x。

感谢。

2 个答案:

答案 0 :(得分:0)

没有管道可以到达两个地方。写入管道的所有内容只能读取一次。 (虽然从理论上讲,您的程序和控制台可以访问相同的输出管道,但如果您成功执行此操作,那么只有部分数据会转到您的程序,而只有那些数据才能进入您的程序控制台。)要获得程序和控制台的所有输出,有人必须阅读并复制数据。在类似unix的系统上,你可以使用“tee”命令,但你可能在Windows机器上没有这个。

因此,您必须在输入时将输出写入控制台。

在这种情况下,您可以放弃在循环中使用readline()而不是readlines()。

答案 1 :(得分:0)

我找到了一种方法可以做到这一点:

for line in os.popen("Fping x.x.x.x x.x.x.x -l"):
    ipList.append(line)
    print(line)

这样,我就可以将Fping程序的结果导入到列表中,并在执行时将其打印到屏幕上,因为for循环os.popen并不是'{1}}等待程序完成,但总是在程序的每一行循环。