Python3: 有没有办法像 python2 一样使用 telnetlib,没有 ascii 编码和 b 前缀?
Python3: Is there a way to use telnetlib like in python2, without ascii encode and b prefix?
有没有办法让 python2 脚本与 python3 和 telnetlib 兼容?
我注意到我需要在 read_until() 前加上字母 b,并且当我想写 () 时,我需要在字符串上使用 encode('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,因为这是唯一的重大更改。
谢谢!
可能不会,因为 Python3 默认使用 utf-8
编码,而 Python2 使用 ascii
。因此,如果您需要 ascii
编码的字符串,您需要手动更改编码。
您可以在 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
的问题。这比查找所有读写操作更容易。
有没有办法让 python2 脚本与 python3 和 telnetlib 兼容?
我注意到我需要在 read_until() 前加上字母 b,并且当我想写 () 时,我需要在字符串上使用 encode('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,因为这是唯一的重大更改。
谢谢!
可能不会,因为 Python3 默认使用 utf-8
编码,而 Python2 使用 ascii
。因此,如果您需要 ascii
编码的字符串,您需要手动更改编码。
您可以在 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
的问题。这比查找所有读写操作更容易。