在Python-Raspbian Linux中处理PIPE



各位。。。。我有一个脚本通过subprocess Popen在Python程序中运行命令创建一个具有脚本输出的管道。它正在发挥作用。然而,我认为我必须使用.communicate()命令来处理程序中管道中的记录。我没能做到这一点,但用这个代码确实做到了。尝试使用.communicate命令时,我做错了什么?

import subprocess
nul_f = open('/dev/null', 'w') 
try:
  tcpdmp = subprocess.Popen(['/usr/bin/sudo /usr/sbin/tcpdump -A -n -p -l -             i eth0 -s0 -w - tcp dst port 80'], 
                    stdout=subprocess.PIPE, shell=True,
                    stderr=nul_f,)
  print 'My Records'
  i=0
#  end_of_pipe = tcpdmp.communicate()
  while i<10:
    i=i+1
    line = tcpdmp.stdout.readline()
    print 't --', i, line
except KeyboardInterrupt:
  print 'done'
tcpdmp.terminate()
tcpdmp.kill()
nul_f.close()

感谢您的任何建议和批评。。。。。RDK-

ps。。。在Raspberry pi上运行Raspbian Linux。。。。

.communicate()等待子进程结束。tcpdump不会和平结束,这就是为什么您的代码有except KeyboardInterrupt(用于处理Ctrl+C)。

无关:您可以用以下内容替换while循环:

from itertools import islice
for line in enumerate(islice(iter(tcpdump.stdout.readline, b''), 10), start=1):
    print 't --', i, line, #NOTE: comma at the end to avoid double newlines

另请参阅,停止读取Python中的进程输出而不挂起?

最新更新