Python Py telnetlib OKI与2.7兼容,但在3.6下出错

Python Py telnetlib OKI与2.7兼容,但在3.6下出错,python,anaconda,telnetlib,Python,Anaconda,Telnetlib,我的案例类似于通过python'telnetlib'连接Google.com 有了python Anaconda 2.7.10 shell,我就有了运行良好的blow脚本: HOST ="www.google.com" tn=telnetlib.Telnet(HOST,"80") tn.write("GET /index.html HTTP/1.1\nHost:"+HOST+"\n\n") l=tn.read_all() print(l) 这给了我们: HTTP/1.1 302 Found C

我的案例类似于通过python'telnetlib'连接Google.com

有了python Anaconda 2.7.10 shell,我就有了运行良好的blow脚本:

HOST ="www.google.com"
tn=telnetlib.Telnet(HOST,"80")
tn.write("GET /index.html HTTP/1.1\nHost:"+HOST+"\n\n")
l=tn.read_all()
print(l)
这给了我们:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.it/index.html?
gfe_rd=cr&dcr=0&ei=A7KiWv_2G6fCXojstrAO
Content-Length: 276
Date: Fri, 09 Mar 2018 16:10:43 GMTenter code here
如果现在使用与上面相同的脚本转到Python Anaconda 3.6.3,则会出现以下错误:

Traceback (most recent call last):
File "<ipython-input-4-0f3256299055>", line 3, in <module>
tn.write("GET /index.html HTTP/1.1\nHost:"+HOST+"\n\n")

File "C:\Users\FP\Anaconda3\lib\telnetlib.py", line 287, in write
if IAC in buffer:

TypeError: 'in <string>' requires string as left operand, not bytesenter    code here
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
tn.write(“GET/index.html HTTP/1.1\n主机:“+HOST+”\n\n”)
文件“C:\Users\FP\Anaconda3\lib\telnetlib.py”,第287行,已写入
如果IAC在缓冲区中:
TypeError:“in”需要字符串作为左操作数,而不是字节在此处输入代码
你对此有什么建议吗?我查阅了一些关于telnetlib的文档,但到目前为止还没有找到解决方案:-(。知道我可能会做什么吗


非常感谢!Fabio。

问题最终归结为Python 2和Python 3中字符串定义方式的不同。如果您从未阅读过这方面的内容,可以在线查找一些资料,例如,使用
字节
对象(Telnet通常使用7位ASCII字符)、字符串Python 3中的(
str
对象)是没有特定编码的文本表示(直到您调用其方法将其转换为
字节
)。当您使用常规字符串调用该方法时,它会检查是否包含
telnetlib.IAC
,即字节对象
b'\xff'
(255);因为这两个对象(参数和
telnetlib.IAC
)有不同的类型,它失败

显然,解决方法是始终只使用
字节
对象(类似字符串,但前缀为
b
):


好的是,您也可以在Python 2中使用
b
-前缀字符串(来自Python 2.6),它们只是普通的Python 2字符串,因此代码适用于两个版本。您还可以研究一些工具,例如使代码移植到Python 3更容易(更多相关主题).

问题最终归结为Python 2和Python 3中字符串定义方式的不同。如果您从未阅读过这方面的内容,您可以在线查找一些资料,例如,使用
字节
对象(Telnet通常使用7位ASCII字符)、字符串(
str
对象)Python3中的文本表示没有特定编码(直到您调用其方法将其转换为
字节
)。当您使用常规字符串调用该方法时,它会检查是否包含
telnetlib.IAC
,这是bytes对象
b'\xff'
(255);因为这两个对象(参数和
telnetlib.IAC
)有不同的类型,它失败

显然,解决方法是始终只使用
字节
对象(类似字符串,但前缀为
b
):


好的是,您也可以在Python 2中使用
b
-前缀字符串(来自Python 2.6),它们只是普通的Python 2字符串,因此代码适用于两个版本。您还可以研究一些工具,例如使代码移植到Python 3更容易(更多相关主题).

我猜telnet希望以字节为单位工作,而不是以您现有的unicode为单位

也许试着编码


tn.write((“GET/index.html HTTP/1.1\n主机:“+HOST+”\n\n”).encode('ascii'))

我猜telnet希望以字节为单位工作,而不是以unicode为单位

也许试着编码


tn.write((“GET/index.html HTTP/1.1\n主机:“+HOST+”\n\n”).encode('ascii'))

这非常有效!我没有意识到py 2和3之间的字符串有这么大的变化。我将有更多的时间查看您发送的链接。我也不知道2to3库,我将尝试转换我以前为SAP数据分析编写的一些代码。非常有趣,您提到jdehesa:-)这太棒了!我没有意识到py 2和3之间的字符串有这么大的变化。我将有更多的时间了解您发送的链接。我也不知道2to3库,我将尝试转换我以前为SAP数据分析编写的一些代码。非常有趣,您提到jdehesa:-)非常感谢您的反馈,效果很好:-)!非常感谢您的反馈,效果很好:-)!
HOST = b"www.google.com"
tn=telnetlib.Telnet(HOST, 80)
tn.write(b"GET /index.html HTTP/1.1\nHost:"+HOST+b"\n\n")
l=tn.read_all()
print(l)