我一直在updating a quaternions package与numpy集成,因此它可以在python 2和python 3中使用。不幸的是,基本导入步骤失败与3失败。 x,尽管python 2.7从来没有失败过。 (我使用python2.7来编译2.7版本,而python3.x来编译3.x版本,这是一个非常简单的distutils事情。)这个错误消息甚至没有出现在google的结果中,我也不知道从这往哪儿走。导入python 3抱怨参数为str/bytes
下面是一个简单的尝试导入的包输出完整:
> python -c 'import quaternion'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/mynamehere/.continuum/anaconda/envs/py3k/lib/python3.4/site-packages/quaternion/__init__.py", line 3, in <module>
from .numpy_quaternion import quaternion
TypeError: __import__() argument 1 must be str, not bytes
随着错误消息指出,存在__init__.py
行说
from .numpy_quaternion import quaternion
但为什么会这样有问题?在与__init__.py
文件相同的目录中有一个文件numpy_quaternion.so
,该文件似乎包含相关符号。 Travis-CI表明它在2.7(以及其他测试通过)中工作得很好,但在3.2和3.4中失败。所以这不仅仅是我的python安装有问题。我试图删除相对导入的.
,但是python找不到要导入的numpy_quaternion
(不奇怪)。我试图将其更改为from quaternion.numpy_quaternion
,但我得到相同的错误。
我看到there have been changes to the import system in python 3,但如果有的话,我会猜测这将是更多 py3k兼容比其他方式做它。出了什么问题?我怎样才能使这个工作?
只是为了澄清,我的层次结构是这样的:
.../site-packages/
quaternion/
__init__.py
numpy_quaternion.so
和到来之前有问题的线路import numpy as np
,一般没有问题成功的唯一的事情。
注意:[将扩展模块移植到Python 3](https://docs.python.org/3/howto/cporting.html):*“C中的Python 3的'PyString_ *'函数等同于Python 2的'PyUnicode_ * '“*。对于Unicode文本使用'PyString',对二进制数据使用'PyBytes'。你的问题中的TypeError表明你以某种方式在Python 3上使用PyBytes,而不是PyString。 – jfs 2014-10-21 02:41:46
啊哈!不是直接的,但我*做*包含'npy_3kcompat.h',它'#define PyString_FromString PyBytes_FromString'。所以它看起来很适合我,但事实并非如此。实际上'PyString_FromString'甚至没有在python3中定义。 – Mike 2014-10-21 03:28:39