我一直在 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 -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-list 人员立即给我回复了很好的建议。原来我在 numpy_quaternion.so
中导入了一些东西(使用 c-api),但是我给那个函数的参数是错误的。我(基本上)使用来自 a similar package 的代码:
PyObject* numpy_str = PyString_FromString("numpy");
PyObject* numpy = PyImport_Import(numpy_str);
我通过使用修复了它
PyObject* numpy = PyImport_ImportModule("numpy");
正如 J. F. Sebastian 在评论中指出的那样,对我来说出错的原因是 PyString_FromString
只是错误函数的 #define
当我正在使用 python 3。
关于python - 导入 python 3 提示参数为 str/bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26470874/