Python3.4使用了一个旧的Python脚本,用于Blender,TypeErrors
我用Python2to3工具转换了一个较旧的Python脚本,使其与Blender兼容。该脚本使Blender3D和欧姆龙PLC之间的通信成为可能。但是,转换后,脚本在Blender 3D控制台中出现以下错误:Python3.4使用了一个旧的Python脚本,用于Blender,TypeErrors,python,string,typeerror,blender,Python,String,Typeerror,Blender,我用Python2to3工具转换了一个较旧的Python脚本,使其与Blender兼容。该脚本使Blender3D和欧姆龙PLC之间的通信成为可能。但是,转换后,脚本在Blender 3D控制台中出现以下错误: TypeError: 'str' does not support the buffer interface 这在以下行中发生: def _send(self, raw): self.sock.send( raw) #print ' Send:' + repr(raw
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
我用谷歌搜索过这个问题,当你转换或使用Python3+的旧脚本时,似乎会出现这个问题。将.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.\u send(c1.raw)
需要正确编码。使用self.\u发送(字节(c1.raw,“utf-8”)
或self.\u发送(c1.raw.encode(“utf-8”)
然而,由于像FinsTCPframe
这样的类实际上是在操作字节流而不是unicode文本,所以我建议只在任何受影响的字符串常量前面添加字节(如b'
而不是'
ord()
围绕bytes
实例的项(例如,如果s
是bytes
实例,s[i]
是该项)应该被删除,因为在Python 3.x中从bytes中检索一个元素已经是int
实例。如果您不能100%确定ord()调用中包含什么,请尝试此操作(脏)解决方法:
safe\u ord=lambda c:ord(c)如果是instance(c,str)否则c
并将相应的ord()
替换为safe\u ord()
chr()
返回一个str
,但如果需要字节,请尝试以下操作:
bytes\u chr=lambda x:bytes([x])
(来自
并将相应的chr()
替换为bytes\u chr()
/
会导致浮点,因此如果要保留旧的行为,请将符号加倍:/
可以在上找到完整的移植指南列表,如果您将来需要进行移植工作,请参阅以下内容:)完整的回溯将有所帮助。(顺便说一句:recieve看起来像一个打字错误)可以在此处找到脚本的原始版本()嗯,我对blender不太熟悉。你能给我一些关于如何重现这个问题的提示吗?如果你运行我在Python 3.4中的dropbox上链接的脚本,它将给出相同的错误。blender使用Python 3+对其“游戏”环境进行编码。但是192.168.106.123:9600上运行的是什么,我如何启动并运行它?没有这个,程序只会因无法连接到主机而引发异常。