2012-03-25 96 views
0

我使用subprocess模块那样:子输出到标准输出和管道

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

我需要output列表,以便在以后的程序对其进行处理,但似乎由于标准输出定向到PIPE它不会将结果输出到控制台。我想同时获得控制台输出(正在执行)和output列表。

我该怎么做?

我已经做了一个搜索,并得到了答案here,但我无法实现它。

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

谢谢。

+0

您可以随时在脚本中回显输出:'print(output)' – 2012-03-25 10:36:47

+0

@LevLevitsky我想获取控制台输出作为正在执行的命令。 – 2012-03-25 10:42:29

+0

那么['os.dup2'](http://docs.python.org/release/3.0.1/library/os.html#file-descriptor-operations)呢? – 2012-03-25 10:49:43

回答

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不等待程序完成,但始终在程序的每一行循环。

0

有没有这样的事情,作为一个管道,去两个地方。写入管道的所有内容只能被读取一次。 (虽然理论上您的程序和控制台可以访问相同的输出管道,但是如果您成功完成此任务,那么只有一部分数据会传送到您的程序中,并且只有那些不会最终生效的数据控制台。)要获得所有输出到您的程序和控制台,有人将不得不读取和复制数据。在一个类似unix的系统上,您可能会使用“tee”命令,但您的Windows计算机上可能没有该命令。

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

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