2011-11-11 86 views
-1

我正在嘗試使用Popen來自動化一個簡單的Telnet會話。在python 2.6.5下面的代碼工作:Python 3 Popen.stdin.write編碼問題

openCmd = subprocess.Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE) 
time.sleep(1) 
openCmd.stdin.write("username\r") 
time.sleep(1) 
openCmd.stdin.write("password\r") 
time.sleep(1) 
openCmd.stdin.write("some command\r") 
openCmd.terminate() 

在Python 3它抱怨類型的錯誤,所以我我不得不.encode()添加到每個STR對象的端部(如下所示)。添加.encode()確實修復了類型錯誤,並且我沒有得到任何異常,但是我試圖在遠程機器上運行的命令沒有運行。

openCmd = subprocess.Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE) 
time.sleep(1) 
openCmd.stdin.write("username\r".encode()) 
time.sleep(1) 
openCmd.stdin.write("password\r".encode()) 
time.sleep(1) 
openCmd.stdin.write("some command\r".encode()) 
openCmd.terminate() 

我也嘗試過.encode(「ascii」)和.encode(「UTF-8」)。我做錯了什麼?我想問題是編碼,但我不知道......我在運行Ubuntu 10.04的機器上運行這個程序。

+0

包含完整的回溯。 – agf

+0

@agf沒有回溯 - 我試圖在遠程機器上運行的命令根本就沒有執行。 – jintoreedwine

回答

2

顯然我所需要做的就是睡在這一張上。事實證明,在Python 2.6.5中,每一個

Popen.stdin.write() 

緩衝區刷新前比Python 3有一個更短的延遲!下面是最終的工作程序:

def writeImmeadiatelyToPopen(openCmd, textToWrite): 
    openCmd.write(textToWrite.encode()) 
    openCmd.flush() 

openCmd = Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE) 
time.sleep(1) 
writeImmeadiatelyToPopen(openCmd, "username\n") 
time.sleep(1) 
writeImmeadiatelyToPopen(openCmd, "password\n") 
time.sleep(1) 
writeImmeadiatelyToPopen(openCmd, "some command\n") 
openCmd.terminate() 

如果有人想知道,我想通了,它是如何工作運行POPEN對「貓」和仔細觀察輸出在Python 2.6.5和Python 3^_ ^。

0

使用python.pexpect在Linux上自動執行telnet會話。

+0

白色可能是一種方式,但仍然無法解決我與Popen之間的問題,而不是按我期望的方式工作。 – jintoreedwine