2015-03-25 28 views
1

我在python代碼中使用pexpect來運行系統命令。在運行該命令時,用戶可能會或可能不會提示一個問題。如果提示他必須回答y。我希望這會自動發生。我寫了下面的代碼 -孩子在TIMEOUT之前死於方面

child = pexpect.spawn("module load xyz") 
child.expect("Are you sure you want to clear all loaded modules.*") 
child.sendline("y") 

如果系統沒有提示有問題的用戶我的問題是會發生什麼,命令成功執行後,孩子死了?

感謝

+1

發生了什麼事當你嘗試過嗎? – mhawke 2015-03-25 00:29:45

+0

給出他的代碼會發生什麼有三種可能性。 1)它會掛起,等待文本出現,然後出現換行符。 2)如果在輸出中找不到請求的字符串,會引發一個'EOF'錯誤。 3)它會掛起,因爲沒有它正在等待緩衝區填滿的換行符。觀點可以挑剔。 – Vorticity 2015-03-25 00:47:10

+0

無法嘗試它,因爲模塊命令中有一些問題。將與其他命令魔杖嘗試讓你知道.. – 2015-03-26 18:34:23

回答

2

你可以用你的expect聲明中while繼續循環和一個try/except來處理在沒有找到預期的返回值的情況。這將允許您優雅地確定您已經達到了流程輸出的結尾,同時,如果需要,還可以根據警告消息採取行動。

child = pexpect.spawn("module load xyz") 
while child.isalive(): 
    try: 
     child.expect(""Are you sure you want to clear all loaded modules.*") 
     child.sendline("y") 
    except EOF: 
     pass 

爲此,您需要致電from pexpect import EOF

但是還有一點需要注意。除非您將緩衝區設置爲適當的大小(我從來沒有得到pexpect的支持),否則這將會掛起,或者您期待的字符串後跟換行符。如果這些都不是真的,你會掛,不知道爲什麼。誠實地說,我寧願用艱難的方式來做,並使用subprocess.Popen,然後從stdoutstderr中讀取,並寫入stdin

還有一條評論。小心使用通配符。他們傾向於以奇怪的方式行事。鑑於你正在尋找什麼,你應該能夠從預期的字符串中刪除星號。

1

要運行命令,並回答'y'如果問題是使用pexpect問:

#!/usr/bin/env python 
import os 
import pexpect # $ pip install pexpect 

pexpect.run("module load xyz", events={ 
    "Are you sure you want to clear all loaded modules": "y" + os.linesep 
}) 

如果你想使用pexpect.spawn直接再簡化的版本可能看起來像:

#!/usr/bin/env python 
import pexpect # $ pip install pexpect 

child = pexpect.spawn("module load xyz") 
while True: 
    i = child.expect(["Are you sure you want to clear all loaded modules", 
         pexpect.EOF, pexpect.TIMEOUT]) 
    if i == 0: 
     child.sendline('y') 
    else: # child exited or the timeout happened 
     break 
相關問題