我用Python2to3工具转换了一个较旧的Python脚本,使其与Blender兼容。该脚本使Blender3D与OMRON之间的通信成为可能。但是,在转换后,脚本在Blender 3D控制台中会出现以下错误:
TypeError: 'str' does not support the buffer interface这发生在以下几行:
def _send(self, raw):
self.sock.send( raw)
#print ' Send:' + repr(raw)
def _recieve(self):
pr = self.sock.recv(8)
length = binstr2int( pr[4:8])
r = pr + self.sock.recv( length)
#print ' Recv:' + repr(r)
return r我已经使用google搜索过这个问题,当您转换或使用一个较旧的3+脚本时,似乎会出现这个问题。将.encode()和.decode()添加到出现问题的对象中也没有帮助。
def _send(self, raw):
self.sock.send( raw.encode())
#print ' Send:' + repr(raw)
def _recieve(self):
pr = self.sock.recv(8).decode()
length = binstr2int( pr[4:8])
r = pr + self.sock.recv( length)
#print ' Recv:' + repr(r)
return r这就产生了另一种错误:
TypeError: can't convert 'bytes' to str implicitly这个脚本不是我做的,我只是用它来做一个学校项目,使软件(Blender3D)和硬件(PLC)之间的通信成为可能。
非常感谢你的帮助,谢谢。
我已经将脚本这里。的转换版本
发布于 2014-04-16 08:51:36
self._send(c1.raw) )需要正确编码。使用self._send(bytes(c1.raw, "utf-8"))或self._send(c1.raw.encode("utf-8"))
但是,由于像FinsTCPframe这样的类实际上是在操作字节流而不是unicode文本,所以我建议只使用字节(在任何受影响的字符串常量前面添加b,比如b''而不是'' )。bytes实例的项的bytes(例如,如果s是bytes实例,则s[i]是项),因为从Python3.x中的字节中检索一个元素已经是int实例。如果您不能100%确定ord()调用中的内容,请尝试以下(脏)解决方法:
safe_ord = lambda c: ord(c) if isinstance(c, str) else c
并将相应的ord()替换为safe_ord()chr()返回一个str,但是如果您需要bytes,请尝试如下:
bytes_chr = lambda x: bytes([x]) (来自这个堆叠溢出问题) )
并将相应的chr()替换为bytes_chr()/在默认情况下会导致浮点数,因此,如果要保留旧的行为,请将符号://加倍。可以在官方python文档站点上找到完整的移植指南列表,如果您需要在将来完成移植工作,请参阅:)
https://stackoverflow.com/questions/23085514
复制相似问题