2016-04-25 44 views
1

末我使用pexpect運行bash的實例:使用Pexpect的檢測慶典輸出

bash = pexpect.spawn("/bin/bash") 

我希望能夠「期待」這個輸出端。目前我使用的是以下幾點:

bash.sendline("ls -ltr") 
lines = [] 
while True: 
    try: 
     bash.expect("\r\n", timeout=0.1) 
     lines.append(bash.before) 
    except pexpect.TIMEOUT: 
     print "TO" 
     break 

這是有效的,但現在看來似乎會更有效,能夠檢測到輸出端,而無需等待pexpect.TIMEOUT。

+0

你怎麼能指望來檢測輸出的結束?通過下一個提示?通過其他標記?通過延遲輸出? –

+0

是的 - 如果它在100ms內沒有換新線,它就會停止 – TDN169

+0

你誤解了我的問題。我在問你如何期望它停止?你會使用什麼標準來代替靜態超時? *如何*可以確定輸出的結束? –

回答

4

您應該期待您的提示。 說你的提示爲「S」,你的代碼應該是:

bash.expect(">") 

,甚至先爲你的提示設置一個變量(如果以後你想改變你的提示;))

prompt = ">" 
bash.expect(prompt) 
0

我發現我的這個偉大的片段(set_unique_prompt)Pexpect的的pxssh.py模塊中,這裏有一個變形例:

UNIQUE_PROMPT = "\[PEXPECT\][\$\#] " 
PROMPT_SET_CSH = "set prompt='[PEXPECT]\$ '" 
def set_unique_prompt(): 
    # expect that the default shell prompt will display at least a "> " 
    c.expect('>\s+$') 
    c.sendline(PROMPT_SET_CSH) 
    i = c.expect([pexpect.TIMEOUT, UNIQUE_PROMPT], timeout=2) 
    if i == 0: 
     print(c.before) 
     print(c.after) 
     raise Exception("couldn't set CSH shell prompt to something unique that we can match on!") 

# start new process 
c = pexpect.spawn('csh') 
set_unique_prompt() 
print("started new shell and renamed it's prompt") 

c.sendline('start_long_running_command') 
while True: 
    i = c.expect([pexpect.TIMEOUT, self.UNIQUE_PROMPT], timeout=5) 
    if i: 
     break 
    else: 
     print('command still running') 
print('long running command finished') 

它基本上啓動一個外殼(在這種情況下CSH),那麼第一將提示簽名更改爲我們預計不會出現在命令輸出中的內容(在這種情況下,我們將其設置爲「[PEXPECT] $」,然後我們可以預期唯一提示符,以便我們知道外殼何時完成。

對於BASH,只是PROMPT_SET_CSH變量更改爲命令BASH使用來改變它的迅速串... pxssh.py建議PROMPT_SET_SH = "PS1='[PEXPECT]\$ '"