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

2024-06-01 00:32:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在运行.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())

输出如下: enter image description here 我尝试了bufsize和其他值,但行为没有改变。 {cdas5>如何快速获得输出?在


Tags: 数据true进程usrstderrstdoutsudo逻辑
2条回答

尝试: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将重定向流上的缓冲模式设置为\u IOFBF(full)。
幸运的是,tcpdump有-l选项,它将模式切换为line buffered:

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

Andrea的解决方案也有效,但我的解决方案也适用于windows。在

相关问题 更多 >