Skip to main content
 首页 » 编程设计

python之子进程不会实时显示来自 tcpdump 的数据。它显示暂停约 10-20 秒

2025年05月04日28mq0036

所以我想从 tcpdump 获取所有数据并在未来添加一些逻辑。 子流程的管道我还没有这样的问题。 我编写代码并并行运行 tcpdump 和 run.py。

运行.py:

from subprocess import Popen, PIPE 
 
# process = Popen(['/usr/bin/sudo', '/usr/sbin/tcpdump', '-i',  'wlan0'], bufsize=1, stdout=PIPE, stderr=PIPE) 
process = Popen('sudo tcpdump -i wlan0', bufsize=1, universal_newlines=True, shell=True, stdout=PIPE, stderr=PIPE) 
while True: 
    print(process.stdout.readline()) 

输出如下所示: 我为 bufsize 和其他尝试了不同的值,但行为没有改变。 如何使用 Subprocess.Popen 获得与 tcpdump 一样快的输出?

请您参考如下方法:

是stdio在tcpdump进程中的缓冲。
默认情况下,stdio 在重定向流上将缓冲模式设置为 _IOFBF(full)。
幸运的是 tcpdump 有 -l 选项,可以将模式切换到行缓冲:

process = Popen('sudo tcpdump -l -i wlan0', bufsize=1, universal_newlines=True,  
                shell=True, stdout=PIPE, stderr=PIPE) 

Andrea 的解决方案也适用,但我的解决方案也适用于 Windows。