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

2 投票
1 回答
843 浏览
提问于 2025-04-17 05:46

我刚刚成功为Python构建了我的第一个C扩展,使用Cython来调用一个现有的C库。

我把我的数据类型和函数按照逻辑结构分成了几个部分(遵循C库的逻辑结构),然后把它们合并成一个pyx文件。之前我尝试单独添加文件时出现了错误(我记得是出现了类似“init已经定义”的错误),在谷歌上查找这个问题后,我发现我需要把所有的pyx文件合并成一个pyx文件。你可以查看这个链接

这是我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命令行输入“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 个回答

3

# 表示一行注释的开始,所以你的 foo.pyx 文件实际上是空的。

include 是一种比较粗糙的方法。建议使用 *.pxd 和 cimport 来替代。

撰写回答