[英]Parsing pexpect output
我正在嘗試實時解析程序塊緩沖的輸出,這意味着在進程結束之前輸出不可用。 我需要的是逐行解析,過濾和管理輸出中的數據,因為它可以運行幾個小時。
我試圖用subprocess.Popen()來捕獲輸出,但是,正如你可能猜到的那樣,Popen無法管理這種行為,它會一直緩沖直到進程結束。
from subprocess import Popen, PIPE
p = Popen("my noisy stuff ", shell=True, stdout=PIPE, stderr=PIPE)
for line in p.stdout.readlines():
#parsing text and getting data
所以我找到了pexpect,它實時打印輸出,因為它將stdout視為文件,或者我甚至可以做一個臟技巧打印出文件並在函數外解析它。 但好吧,它太臟了,即使對我來說也是如此;)
import pexpect
import sys
pexpect.run("my noisy stuff", logfile=sys.stdout)
但我想它應該是一個更好的pythonic方式來做到這一點,只需像子進程一樣管理stdout。 Popen。 我怎樣才能做到這一點?
編輯:
運行JF提案:
這是一次故意錯誤的審計,大約需要25秒。 停止。
from subprocess import Popen, PIPE
command = "bully mon0 -e ESSID -c 8 -b aa:bb:cc:dd:ee:00 -v 2"
p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE)
for line in iter(p.stdout.readline, b''):
print "inside loop"
print line
print "outside loop"
p.stdout.close()
p.wait()
#$ sudo python SCRIPT.py
### <= 25 secs later......
# inside loop
#[!] Bully v1.0-21 - WPS vulnerability assessment utility
#inside loop
#[!] Using 'ee:cc:bb:aa:bb:ee' for the source MAC address
#inside loop
#[X] Unable to get a beacon from the AP, possible causes are
#inside loop
#[.] an invalid --bssid or -essid was provided,
#inside loop
#[.] the access point isn't on channel '8',
#inside loop
#[.] you aren't close enough to the access point.
#outside loop
改為使用這種方法:編輯:由於輸出中有大的延遲和超時,我不得不修復孩子,並添加了一些黑客,所以最終代碼看起來像這樣
import pexpect
child = pexpect.spawn(command)
child.maxsize = 1 #Turns off buffering
child.timeout = 50 # default is 30, insufficient for me. Crashes were due to this param.
for line in child:
print line,
child.close()
返回相同的輸出,但它實時打印行。 所以...已解決了謝謝@JF Sebastian
.readlines()
讀取所有行。 難怪在子進程結束之前你沒有看到任何輸出。 一旦子.readline()
刷新其stdout緩沖區,您就可以使用.readline()
來.readline()
讀取:
from subprocess import Popen, PIPE
p = Popen("my noisy stuff", stdout=PIPE, bufsize=1)
for line in iter(p.stdout.readline, b''):
# process line
..
p.stdout.close()
p.wait()
如果您已經有了pexpect
那么您可以使用它來解決塊緩沖問題:
import pexpect
child = pexpect.spawn("my noisy stuff", timeout=None)
for line in child:
# process line
..
child.close()
另請參閱我在評論中鏈接的問題中的stdbuf
,基於pty
的解決方案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.