子进程不会实时显示来自 tcpdump 的数据。它显示暂停约 10-20 秒
Subprocess doesn't show data from tcpdump in realtime. It shows with a pause about 10-20 seconds
所以我想从 tcpdump
获取所有数据并在将来添加一些逻辑。
子流程的管道我还没有这样的问题。
我并行编写了代码和 运行 tcpdump
和 run.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。
所以我想从 tcpdump
获取所有数据并在将来添加一些逻辑。
子流程的管道我还没有这样的问题。
我并行编写了代码和 运行 tcpdump
和 run.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。