Python3: Есть ли способ использовать telnetlib, как в python2, без кодирования ascii и префикса b? - PullRequest
2 голосов
/ 11 февраля 2020

Есть ли способ сделать python2 сценарии совместимыми с python3 с помощью telnetlib?

Я заметил, что мне нужно добавить префикс read_until () к букве b, и мне нужно использовать кодирование (' ascii ') на строку, когда я хочу написать ().

Python2

tn = telnetlib.Telnet("192.168.1.45")
tn.write("ls " + dirname + "\n")
answer = tn.read_until(":/$")

Python3

tn = telnetlib.Telnet("192.168.1.45")
cmd_str = "ls " + dirname + "\n"
tn.write(cmd_str.encode('ascii'))
answer = tn.read_until(b":/$")

Это поможет мне обновить многие скрипты до 3.x, поскольку это единственное существенное изменение.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы можете написать свой собственный подкласс в encodingtelnetlib.py

class Telnet(Telnet):

    def __init__(self, host=None, port=0,
                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                 encoding='ascii'):
         self.encoding = encoding
         super().__init__(host, port, timeout)

    def write(self, buffer):
        if isinstance(buffer, str):
            buffer = buffer.encode(self.encoding)
        return super().write(buffer)

    # and etc.... for other methods

Теперь вопрос об изменении import telnetlib в import encodingtelnetlib as telnetlib. Это проще, чем найти каждое чтение и запись.

0 голосов
/ 11 февраля 2020

Вероятно, не так, как Python3 использует кодировку utf-8 по умолчанию, в то время как Python2 использует ascii. Поэтому, если вам нужна строка в кодировке ascii, вам нужно вручную изменить кодировку.

...