Проблемы с кодировкой Python 3 Popen.stdin.write - PullRequest
0 голосов
/ 11 ноября 2011

Я пытаюсь использовать Popen для автоматизации простого сеанса telnet. В python 2.6.5 работает следующий код:

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.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Видимо, все, что мне нужно было сделать, это спать на этом. Оказывается, в 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 против 'cat' и внимательно наблюдая за выводом в Python 2.6.5 и Python 3 ^ _ ^.

0 голосов
/ 11 ноября 2011

Используйте python.pexpect для автоматизации сеанса telnet в Linux.

...