在Python Shell中使用Telnet时为什么会出现此错误消息

时间:2014-04-22 13:31:24

标签: python macos raspberry-pi telnet

我遇到了问题,因为我正在尝试使用telnet连接到我的覆盆子pi但是当它涉及用户名条目的部分时,我得到了一个错误,我已经粘贴了。

#IMPORTS
from tkinter import *
import time
import telnetlib
import sys
import getpass
import tkinter.messagebox


#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: ")
bot.write(user + "\n")
bot.read_until("Password: ")
bot.write(pass_ + "\n")
bot.write("cd PiBits/ServoBlaster")


#DEFINITIONS


#STUFF
master = Tk()

#LEFT
left = Scale(master,from_=0,to=249,length=550,width=25,tickinterval=152,sliderlength=30)
left.pack()
left.set(152)
left.grid(row=0, column=2)

#RIGHT
right = Scale(master,from_=0,to=249,length=550,width=25,tickinterval=152,sliderlength=30)
right.pack()
right.set(152)
right.grid(row=0, column=12)

#MIDDLE

mid = Scale(master,from_=0,to=249,length=550,width=25,tickinterval=152,sliderlength=30)
mid.pack()
mid.set(152)
mid.grid(row=0, column=7)

#RUN CANVAS
mainloop()

我收到以下错误消息:

Traceback (most recent call last):
  File "/Users/kiancross/Desktop/PROJECTS/RASPBERRY_PI/ROBOT/CONTROLLER_GUI/RPi_BOT_CONTROLLER.py", line 16, in <module>
    bot.read_until("login: ", timeout=NONE)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/telnetlib.py", line 304, in read_until
    i = self.cookedq.find(match)
TypeError: Type str doesn't support the buffer API

请有人告诉我为什么我收到错误消息以及如何解决它?

由于

1 个答案:

答案 0 :(得分:2)

TypeError: Type str doesn't support the buffer API

这是一个棘手的错误 - 它告诉你足够的帮助,但只有你知道问题是什么。

在Python 3中,字节之间存在明显差异:

b'This is a byte string'

常规unicode或str字符串:

'This is a regular unicode string'

这是一个重要的区别,没有人真正关心美国是互联网上唯一的国家,而ASCII是网络的编码法郎。但是现在我们需要代表0-254个字符。这是unicode的用武之地。

现在,在大多数语言中,它们都像是二进制数据一样抛出字符串,反之亦然,这可能导致各种奇怪和意想不到的怪癖。 Python3试图通过决定明确字节和文本之间的区别来尝试做正确的事情(tm),并且在很大程度上取得了成功。字节只是二进制数据,您可以将这些字节解码为您想要的任何编码(UTF,ASCII,疯狂) - 但您只应在将其显示给用户时执行此操作。否则,二进制数据就是您传递的内容。

我告诉过你这个故事:

bot.read_until("login: ", timeout=None)

包含以下 unicode str - "login: "str不支持缓冲区接口,但bytes不支持。

使用以下首字母缩写词来帮助您记住: BADTIE

B ytes
A 重新确认 D ecoded
T 分机 s
E ncoded

并将其写为bot.read_until("login: ".encode(), timeout=None)您还需要修复其他字符串。应该工作的另一个选择就是将其更改为b"login: ",但我从未尝试过。