2015-10-14 39 views
1

我有使用Pexpect的,看起來像這樣這條巨蟒功能:如何使Pexpect的命令執行無交互()在我的計劃

def executeCommandWithOtherUser(command): 
    p = pexpect.spawn('su', ['otherUser']) 
    p.expect('Password:') 
    p.sendline('1234') 
    prompt = '.*$' 
    p.expect(prompt) 
    p.sendline(command) 

    #p.interact() 
    p.close() 
    return 

當我嘗試這個代碼,它不執行命令(使用例如觸摸x.txt進行測試)。如果啓用pexpect日誌記錄,我可以看到該命令,但在程序結束時沒有發生任何事情。如果我用p.interact()取消註釋,它確實有效。但是,這給用戶的控制權,我需要手動退出程序。

爲什麼函數不執行沒有交互的命令?我能做些什麼來使它工作?

+0

在命令後面加上'p.expect(prompt)'*,等待命令結束。 – jfs

+0

我試過了,但沒有改變行爲。 – pigelin

+0

在提示符中跳出美元符號:'r'\ $''(否則'$'是模式內的正則表達式元字符) – jfs

回答

1

問題是沒有正確指定提示正則表達式(prompt = '.*$')。當前提示字符串正則表達式也會匹配空輸入,因爲$具有特殊的正則表達式含義,並且不會用\轉義。下面的代碼的工作原理:

def executeCommandWithOtherUser(command): 
    p = pexpect.spawn('su', ['otherUser']) 
    p.expect('Password:') 
    p.sendline('1234') 
    prompt = r'\$' 
    p.expect(prompt) 
    p.sendline(command) 
    p.expect(prompt) 
    p.close() 
    return 

expect()一種替代方法是使用expect_exact(),它採用普通的字符串相匹配的,而不是正則表達式。

1

輸入密碼後 - 即在遠端準備接收您的命令之前,您正在插入您的命令立即

在發送命令之前,您需要預期遠程提示。

+0

但不是我做什麼,當我寫sendline之前p.expect(提示)?我已經試過sendline(命令)後添加預期(提示)),但它似乎不工作。你的建議讓我嘗試了sendline之後的time.sleep,這實際上使它工作。所以這與等待提示有關。 – pigelin