Python3中的Import以str/bytes形式抱怨参数
我一直在考虑与numpy集成,这样它就可以在Python2和Python3中使用。不幸的是,基本导入步骤在3.x中失败得很惨,尽管在Python2.7中从未失败过。(我用python2.7来编译2.7版本,用python3.x来编译3.x版本。这是一个非常简单的distutils工具。)错误信息甚至没有出现在谷歌的结果中,我只是不知道从这里该去哪里 以下是导入包的简单尝试的完整输出:Python3中的Import以str/bytes形式抱怨参数,python,python-2.7,python-3.x,python-import,python-c-api,Python,Python 2.7,Python 3.x,Python Import,Python C Api,我一直在考虑与numpy集成,这样它就可以在Python2和Python3中使用。不幸的是,基本导入步骤在3.x中失败得很惨,尽管在Python2.7中从未失败过。(我用python2.7来编译2.7版本,用python3.x来编译3.x版本。这是一个非常简单的distutils工具。)错误信息甚至没有出现在谷歌的结果中,我只是不知道从这里该去哪里 以下是导入包的简单尝试的完整输出: > python -c 'import quaternion' Traceback (most recen
> 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
但为什么会有问题呢?有一个文件numpy\u四元数.so
与\uuuuu init\uuuuuuu.py
文件位于同一目录中,该文件似乎包含相关符号。显示它在2.7中工作正常(其他测试通过),但在3.2和3.4中失败。所以这不仅仅是我的python安装有问题。我试图删除相对导入的
,但python找不到要从中导入的numpy\u四元数(不足为奇)。我尝试将其从四元数.numpy\u四元数更改为,但得到了相同的错误
我明白了,但如果有什么不同的话,我会猜这比其他方法更符合py3k。怎么了?我怎样才能让它工作
为了澄清,我的层次结构如下所示:
.../site-packages/
quaternion/
__init__.py
numpy_quaternion.so
在出现问题的行之前,唯一的一件事是将numpy导入为np
,这通常是成功的,没有问题。因为这很简单,我会首先尝试绝对导入,但是如果我下面的猜测是正确的,这将不起作用
from quaternion.numpy_quaternion import quaternion
从你的帖子中,我猜你的层次结构
.../Libe/site-packages
quaternion
__init__.py
numpy_quaternion.so
quaternion # a symbol in .so, not a .py
四元数是一个模,而不是一个函数或类。我猜这是因为我无法想象“numpy_四元数”变成字节,而.so必须将“四元数”作为字节返回,以使2.7正常工作,所以可能对3.x也是如此。我的unix经验早于Python。但我的印象是,2.x和3.x是分开的。否则,可能需要某些编译标志。如果我是正确的,您需要将'numpy_quaternion_3x.so'添加到包中,并在sys.version[0]上切换导入
如果您在这里没有得到更多响应,请尝试python列表,该列表可以在news.gmane.com上轻松访问为新闻组mirror gmane.comp.python.general。定期的回复者包括一些精明的linux用户。python列表中的人马上给了我很好的建议。原来我是在导入numpy\u四元数中的东西。所以(使用c-api),但我给该函数的参数是错误的。我(基本上)使用的代码来自:
我用电脑把它修好了
PyObject* numpy = PyImport_ImportModule("numpy");
正如J.F.Sebastian在评论中指出的那样,对我来说出错的原因是因为当我使用python 3时,PyString\u FromString
只是对错误函数的\define
。是的,我尝试了绝对导入。(在我的帖子中提到过,但我没有说清楚。)另外,py2.7和py3.x有单独的lib
目录,每个目录都用于编译自己的目录,所以它们有自己的。所以文件。(py3.x甚至不知道py2.7的存在。)不过,我会试试python列表。谢谢注意::“C语言中Python3的PyString.*
函数等同于Python2的PyUnicode.*
”。Unicode文本使用PyString
,二进制数据使用PyBytes
。您问题中的TypeError建议您以某种方式在Python3上使用PyBytes,而不是PyString.Aha!不是直接的,但我确实包含了npy\u 3kcompat.h
,它定义了PyString\u FromString PyBytes\u FromString
。所以在我看来是对的,但事实并非如此;实际上,python3中甚至没有定义PyString\u FromString
。
PyObject* numpy_str = PyString_FromString("numpy");
PyObject* numpy = PyImport_Import(numpy_str);
PyObject* numpy = PyImport_ImportModule("numpy");