我刚刚设法使用Cython调用现有的C库,为Python构建了我的第一个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

最佳答案

#声明注释行的开头,因此您的foo.pyx实际上为空。

include是一种钝器。使用*.pxd and cimport代替。

关于python - Cython内置扩展无法导出数据类型和功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8032861/

10-08 21:41