我如何在cython中使用预编译的库?

时间:2014-05-08 00:26:10

标签: python compilation cython

我正在尝试编译一个在安装时预编译的模块的快速扩展(.pyd)。下面是我正在尝试做的一个简单的例子。鉴于foo.pyd

baz.pxd

from foo.bar cimport Bar

cdef class Baz(Bar):
    pass

baz.pyx

cdef class Baz(Bar):
    def __init__(self, *a, **k):
        ...

setup.py

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

extensions = [Extension('baz', ['baz.pyx',], libraries=['foo.pyd',])]
setup(name='baz', ext_modules=cythonize(extensions))

我尝试了上述的许多变化,但无济于事。

1 个答案:

答案 0 :(得分:4)

cimport用于C / C ++ API(函数,结构,类)和来自.pxd文件的读取,这些文件是C / C ++头文件的Cython对应文件。如果您在编译时没有.pxdfoo,则不能cimport。{ Python扩展模块(Windows上的.pyd,Linux上的.so)通常根本没有C API:它们只包含外部可见的符号,允许Python模块导入器将其内容识别为Python模块。

此外,如果您想从模块中获取Python类(甚至是作为扩展类型实现的类),则需要import它。我不认为cdef class可以从这样的类中继承。