今天测试使用 NGLview, 然后发现, 昨天在用Anaconda2的时候还好好的, 怎么今天新装了Anaconda3就不行了呢?? 还去官方Github Issue了问题.. 没有相关...
后来试了一堆新建环境, 例如不同版本的python, 不同版本的ipywidgets
和widgetsnbextension
, 不同版本的nglview
, 只要在Py2都OK, Py3都不行..
后来在看一个帖子时, 建议使用nv.demo()
来测试, 而不是官网展示的例子. 于是试了一下, 成功了. 黑人问号脸....
于是查看了PdbIdStructure
与demo
的源码, 并测试了其返回的字符串, 发现了前者获得字符串是b'.....'
, 而后者是普通字符串. 因为新从Py2转Py3, 不知道何问题, 于是找了一下...
原来, Python3里面有Byte
这种类型, byte string是Py2默认的字符串, 而unicode string才是Py3的默认字符串. 在PdbIdStructure
里面, 用了urlopen(url).read()
获取文件内容, 返回的就是byte string (为了向下支持?)
好吧, 那就把这个返回的Byte string转为Unicode型就好了. 于是问题成果解决!
## 原来返回Byte的代码
return urlopen(url).read()
## 转为Unicode String
return urlopen(url).read().decode("utf-8")
## 或者
return str(urlopen(url).read(), encoding='utf-8')
好了, 折腾了我一天.... 时间就是金钱啊!!!!
小记:
# bytes object
b = b"example"
# str object
s = "example"
# str to bytes
bytes(s, encoding = "utf8")
# bytes to str
str(b, encoding = "utf-8")
# an alternative method
# str to bytes
str.encode(s)
# bytes to str
bytes.decode(b)
网友评论