下面是我的代码的最小示例,如果您运行,应重新创建我遇到的问题。我遇到的一件事是,如果我的覆盆子pi(我使用柜员连接的东西)关闭或互联网电缆被拔掉,则不会出现错误。
#IMPORTS
import time
import telnetlib
import sys
import getpass
#TELNET
user = input("Please Enter Your Username: ")
time.sleep(0.4)
pass_ = input("Please Enter Your Password: ")
bot = telnetlib.Telnet("192.168.1.128")
bot.read_until("login: ".encode(), timeout=None)
bot.write(user + "\n")
bot.read_until("Password: ".encode(), timeout=None)
bot.write(pass_ + "\n")
bot.write("cd PiBits/ServoBlaster")
我收到以下错误消息:
Traceback (most recent call last):
File "/Users/kiancross/Desktop/PROJECTS/RASPBERRY_PI/ROBOT/CONTROLLER_GUI/RPi_BOT_CONTROLLER.py", line 17, in <module>
bot.write(user + "\n")
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/telnetlib.py", line 289, in write
if IAC in buffer:
TypeError: 'in <string>' requires string as left operand, not bytes
我正在运行以下代码,您可以在this帖子中看到,但正如您从答案中看到的,我将其更改为上面的代码,从而导致上述错误消息。
我应该说代码没有接近完成,很多东西只是为了测试,直到我让telnet工作!
我已尝试修复this帖子中提到的旧版python。
我使用print(type(user))
来查看变量是什么类型,它们是字符串。我已尝试bot.write((user + "\n").encode(latin-1))
,如此修复程序中所示,但仍会显示错误消息。我也试过unicode编码。我理解该行的一部分编码错误,但我不知道它是变量还是"\n"
。我已经尝试过bot.write(user + b"\n")
,但这可以解决错误。
如果有人有任何其他方法可以阻止此错误,我将非常感谢他们。
由于
P.S Im在python 3.4.0上运行
修改
我试过这个:
bot = telnetlib.Telnet("192.168.1.128")
bot.write(user + "\n".encode('ascii'))
bot.read_until(b"Password: ")
bot.write((pass_ + "\n").encode('ascii'))
但我仍然得到同样的错误。
当我这样做时:
bot = telnetlib.Telnet("192.168.1.128")
bot.read_until(b"login: ")
bot.write(user + b"\n")
bot.read_until(b"Password: ")
bot.write(pass_ + b"\n")
我得到了一个不同的错误:
Traceback (most recent call last):
File "/Users/kiancross/Desktop/PROJECTS/RASPBERRY_PI/ROBOT/CONTROLLER_GUI/RPi_BOT_CONTROLLER.py", line 23, in <module>
bot.write(user + b"\n")
TypeError: Can't convert 'bytes' object to str implicitly
所有错误似乎都表明它需要是一个字符串,但我的变量已经是字符串了。
由于
答案 0 :(得分:9)
telnet接口可能希望以字节而不是Unicode工作。我已经在Python3上测试了这段代码,它避免了错误:
import telnetlib
bot = telnetlib.Telnet("127.0.0.1", 22)
user = "dobbs"
bot.write((user + "\n").encode('ascii'))
print(bot.read_all())