2011-11-11 63 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