簡體   English   中英

解析pexpect輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM