2011-11-11 10 views
-1

Popenを使って簡単なTelnetセッションを自動化しようとしています。パイソン2.6.5に次のコードは動作しますPython 3 Popen.stdin.write encoding issues

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() 

パイソン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 3がやったよりもフラッシュされた前のPython 2.6.5ですべての

Popen.stdin.write() 

が短い遅延を持っていたことが判明します!ここでは、最終的な作業プログラムは次のとおりです。

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() 

誰もが疑問に思った場合、私はそれが3^_^'猫に対してpopenのを実行して、働いて、慎重にPythonの2.6.5とPythonで出力を見て方法を考え出しました。

0

Linuxでのtelnetセッションを自動化するためにpython.pexpectを使用します。

+0

白は、私が期待しているように働かないPopenとの私の問題を解決していない。 – jintoreedwine