2015-04-03 14 views
1

Folks ....我有一個腳本在Python程序中運行,通過subprocess Popen 命令來創建一個包含腳本輸出的管道。這是工作。但是我認爲我將不得不使用.communicate()命令來處理來自我的程序的管道中的記錄。我無法得到這個工作,但確實得到它與這個代碼的工作。當我嘗試使用.communicate命令時,我做錯了什麼?在Python中處理PIPE - Raspbian Linux

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 ......在樹莓派運行Raspbian Linux的....

回答

1

.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 

參見,Stop reading process output in Python without hang?

+0

JF .... OK,感謝您的解釋,參考和交替代碼... .RDK – RDK 2015-04-04 05:21:34