[英]Python 3.4 with an older Python script for use in Blender, TypeErrors
我已经使用Python 2to3工具转换了较旧的Python脚本,以使其与Blender兼容。 该脚本使Blender3D和OMRON PLC之间的通信成为可能。 但是,转换后,脚本在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搜索了问题,当您将其转换为Python 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)之间的通信成为可能。
帮助将不胜感激,谢谢。
我将转换后的脚本版本放在这里。
诸如self._send(c1.raw)
类的仅字节操作需要正确编码。 使用self._send(bytes(c1.raw, "utf-8"))
或self._send(c1.raw.encode("utf-8"))
但是,由于FinsTCPframe
类的类FinsTCPframe
是在操作字节流而不是unicode文字,因此建议您坚持使用字节(将b
附加在任何受影响的字符串常量之前,例如b''
而不是''
应该删除bytes
实例某个项目周围的ord()
(例如,如果s
是一个bytes
实例,则s[i]
是该项目),因为从Python 3.x中的字节中检索一个元素已经是一个int
实例。 如果您不能100%确定ord()调用中包含的内容,请尝试以下解决方法:
safe_ord = lambda c: ord(c) if isinstance(c, str) else c
并将对应的ord()
替换为safe_ord()
python 3中的chr()
返回str
,但是如果您需要bytes
,请尝试以下操作:
bytes_chr = lambda x: bytes([x])
(来自此stackoverflow问题)
并将相应的chr()
替换为bytes_chr()
默认情况下,除法/
会导致浮点运算,因此,如果要保留旧的行为,请将该符号加倍: //
移植指南的完整列表可以在官方python docs网站上找到 ,如果将来需要进行移植工作,请查阅此指南:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.