Python 3 Popen.stdin.проблемы с кодировкой записи

#character-encoding #python-3.x #telnet #subprocess

#кодировка символов #python-3.x #telnet #подпроцесс

Вопрос:

Я пытаюсь использовать 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("usernamer")
time.sleep(1)
openCmd.stdin.write("passwordr")
time.sleep(1)
openCmd.stdin.write("some commandr")
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("usernamer".encode())
time.sleep(1)
openCmd.stdin.write("passwordr".encode())
time.sleep(1)
openCmd.stdin.write("some commandr".encode())
openCmd.terminate()
  

Я также пробовал .encode («ascii») и .encode («UTF-8»). Что я делаю неправильно? Я полагаю, что проблема связана с кодировкой, но я не знаю наверняка… Я запускаю эту программу на компьютере под управлением Ubuntu 10.04.

Комментарии:

1. @agf Нет обратной трассировки — команда, которую я пытаюсь запустить на удаленном компьютере, просто не выполняется.

Ответ №1:

По-видимому, все, что мне нужно было сделать, это переспать с этим. Оказывается, что в 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, "usernamen")
time.sleep(1)
writeImmeadiatelyToPopen(openCmd, "passwordn")
time.sleep(1)
writeImmeadiatelyToPopen(openCmd, "some commandn")
openCmd.terminate()
  

На случай, если кому-то интересно, я выяснил, как это работает, запустив Popen против ‘cat’ и внимательно просмотрев выходные данные в Python 2.6.5 и Python 3 ^_ ^ .

Ответ №2:

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

Комментарии:

1. Белый это может быть один из способов, который все еще не решает мою проблему с Popen, работающим не так, как я ожидаю.