首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.4带有一个较旧的Python脚本,用于Blender,TypeErrors

Python3.4带有一个较旧的Python脚本,用于Blender,TypeErrors
EN

Stack Overflow用户
提问于 2014-04-15 13:42:34
回答 1查看 401关注 0票数 0

我用Python2to3工具转换了一个较旧的Python脚本,使其与Blender兼容。该脚本使Blender3D与OMRON之间的通信成为可能。但是,在转换后,脚本在Blender 3D控制台中会出现以下错误:

代码语言:javascript
复制
TypeError: 'str' does not support the buffer interface

这发生在以下几行:

代码语言:javascript
复制
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()添加到出现问题的对象中也没有帮助。

代码语言:javascript
复制
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

这就产生了另一种错误:

代码语言:javascript
复制
TypeError: can't convert 'bytes' to str implicitly

这个脚本不是我做的,我只是用它来做一个学校项目,使软件(Blender3D)和硬件(PLC)之间的通信成为可能。

非常感谢你的帮助,谢谢。

我已经将脚本这里。的转换版本

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 08:51:36

  1. 只使用字节的操作(如self._send(c1.raw) )需要正确编码。使用self._send(bytes(c1.raw, "utf-8"))self._send(c1.raw.encode("utf-8")) 但是,由于像FinsTCPframe这样的类实际上是在操作字节流而不是unicode文本,所以我建议只使用字节(在任何受影响的字符串常量前面添加b,比如b''而不是'' )。
  2. 应该删除围绕bytes实例的项的bytes(例如,如果sbytes实例,则s[i]是项),因为从Python3.x中的字节中检索一个元素已经是int实例。如果您不能100%确定ord()调用中的内容,请尝试以下(脏)解决方法: safe_ord = lambda c: ord(c) if isinstance(c, str) else c 并将相应的ord()替换为safe_ord()
  3. python 3中的chr()返回一个str,但是如果您需要bytes,请尝试如下: bytes_chr = lambda x: bytes([x]) (来自这个堆叠溢出问题) ) 并将相应的chr()替换为bytes_chr()
  4. 除法/在默认情况下会导致浮点数,因此,如果要保留旧的行为,请将符号://加倍。

可以在官方python文档站点上找到完整的移植指南列表,如果您需要在将来完成移植工作,请参阅:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23085514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档