如何在python中执行ping或traceroute,在生成时访问输出?

Dav*_*gac 3 python ping traceroute

早些时候,我问过这个问题:

如何使用本机python执行ping或traceroute?

但是因为python没有以root身份运行,所以它无法打开在本机python中执行ping/traceroute所需的原始ICMP套接字.

这让我回到使用系统的ping/traceroute shell命令.这个问题有几个使用该subprocess模块的例子似乎运作良好:

用Python ping一个站点?

我还有一个要求:我需要能够在生成时访问输出(例如,对于长时间运行的traceroute.)

上面的示例都运行shell命令,然后只有在命令完成后才能访问完整的输出.有没有办法在生成时访问命令输出?

编辑:根据Alex Martelli的回答,这是有效的:

import pexpect

child = pexpect.spawn('ping -c 5 www.google.com')

while 1:
        line = child.readline()
        if not line: break
        print line,
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 6

pexpect是我所要达到的,"默认情况下",对于任何需求,例如你的 - 还有其他类似的模块,但是pexpect几乎总是最富有,最稳定,最成熟的.如果我不得不在Windows下正确运行(ping和traceroute可能有他们自己的问题),那么我会费心寻找替代方案的一个案例 - 让我们知道你是否就是这种情况,我们会看看可以安排什么! - )


its*_*dok 5

您应该阅读subprocess模块的文档,它描述了如何运行外部进程并实时访问其输出。

基本上,你做

from subprocess import Popen, PIPE
p = Popen(['tracert', host], stdout=PIPE)
while True:
    line = p.stdout.readline()
    if not line:
        break
    # Do stuff with line
Run Code Online (Sandbox Code Playgroud)

实际上,您链接到的 SO 问题中的答案非常接近您的需要。Corey Goldberg 的回答使用了管道和readline,但由于它运行 ping-n 1并持续时间不足以产生影响。