Cython构建的扩展无法导出数据类型和函数

时间:2011-11-07 04:54:06

标签: python cython python-extensions

我刚刚设法为Python构建我的第一个C扩展,使用Cython调用现有的C库。

我声明并将我的数据类型和函数定义为逻辑组件(遵循C库的逻辑结构),并将它们组合成一个pyx文件 - 在我尝试单独添加文件时发生错误(IIRC我得到了一个类似于已经定义的init的错误 - 在Google上研究了这个问题之后,我发现我必须将所有pyx文件信息组合成一个pyx文件) - 请参阅this link

这是我的foo.pyx文件内容的副本:

#include "myarray.pyx"
#include "myset.pyx"
#include "mycalc.pyx"

这是我的设置文件的副本:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("foo", ["foo.pyx"],
                                 libraries=["foo_core"])
                  ]
)

扩展程序成功构建到foo.so中 然后我可以在Python CLI中输入“import foo”。这也有效。但是,当我尝试访问myarray.pxd,myarray.pyx等中声明/定义的任何类时,我收到错误消息:

AttributeError: 'module' object has no attribute 'myArray'

然后我尝试了dir(),看看foo模块正在导出什么。令我惊讶的是,这就是它列出的内容:

>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__test__']

为什么Cython无法导出我声明和定义的结构,类和函数?我认为我的pxd和pyx文件没有任何问题,因为就像我说的那样,它成功编译并生成共享库(python扩展)。

我在Ubuntu上使用Cython 0.15.1和Python 2.6.5

1 个答案:

答案 0 :(得分:3)

#声明评论行的开头,因此foo.pyx实际上是空的。

include是一种钝器。请改用*.pxd and cimport