2014-10-20 38 views
3

我一直在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,一般没有问题成功的唯一的事情。

回答

3

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"); 

随着JF塞巴斯蒂安在评论中指出,固定它,这是走错了,我是因为该原因PyString_FromString只是一个#define错误的功能,当我使用python 3.

+1

注意:[将扩展模块移植到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

+0

啊哈!不是直接的,但我*做*包含'npy_3kcompat.h',它'#define PyString_FromString PyBytes_FromString'。所以它看起来很适合我,但事实并非如此。实际上'PyString_FromString'甚至没有在python3中定义。 – Mike 2014-10-21 03:28:39

0

既然这很容易,我会先尝试一个绝对导入,但如果我的猜测是正确的,这是行不通的。

from quaternion.numpy_quaternion import quaternion 

从您的文章,我猜测您的层次结构看起来像

.../Libe/site-packages 
    quaternion 
    __init__.py 
    numpy_quaternion.so 
     quaternion # a symbol in .so, not a .py 

和quaterion是一个模块,而不是一个函数或类。我猜这是因为我无法想象'numpy_quaternion'变成了字节,而.so必须返回'quaternion'作为2.7的字节才能工作,所以也许它与3.x一样。我的unix经验早于Python。但我的印象是,单独的.so是2.x和3.x所必需的。否则,可能需要某些编译标志。如果我是正确的,则需要将'numpy_quaternion_3x.so'添加到您的包中,并在sys.version [0]上切换导入。

如果您在这里没有得到更多答复,请尝试python-list,在news.gmane.com上轻松访问,作为新闻组镜像gmane.comp.python.general。常规响应者包括一些精明的Linux用户。

+0

是的,我试过绝对导入。 (在我的文章中提到过,但我没有说清楚。)另外,py2.7和py3.x有单独的'lib'目录,每个目录都用于编译它自己的目录,所以它们确实得到它们的拥有'.so'文件。 (py3.x甚至不知道py2.7的存在。)但我会尝试在python列表中。谢谢! – Mike 2014-10-20 22:22:39