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

Subprocess doesn't show data from tcpdump in realtime. It shows with a pause about 10-20 seconds

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

run.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 一样快地获得输出?

尝试:sudo stdbuf -oL tcpdump -i wlan0

对我有用

from subprocess import Popen, PIPE

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

是tcpdump进程中的stdio缓冲
默认情况下,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。