Python3.4使用了一个旧的Python脚本,用于Blender,TypeErrors

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

我用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)
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()

  • python 3中的
    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上运行的是什么,我如何启动并运行它?没有这个,程序只会因无法连接到主机而引发异常。