我是cython的新手。
现在,我正在尝试导入标准c库并在pyx文件中定义一个简单的函数:
from libc.math cimport sin
cdef double f(double x):
return sin(x*x)
我用这个文件编译:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules=[
Extension("demo",
["demo.pyx"],
libraries=["m"]) # Unix-like specific
]
setup(
name = "Demos",
cmdclass = {"build_ext": build_ext},
ext_modules = ext_modules
)
生成一个名为demo.so的库 现在我试图在python文件中调用这个“f”函数:
import demo
print demo.f(2)
编译说,
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'f'
有谁知道,如何在pyx文件中调用该函数?谢谢!
答案 0 :(得分:6)
使用cdef
定义的函数不能从python访问。您可以编写它们并在cython代码中使用它们,但它们无法公开。
如果您要公开某个功能,请使用def
定义,或使用cpdef
定义。
使用def
你将创建一个普通的python函数,这意味着在cython代码中使用该函数可能需要更多的转换然后使用cdef
(因此需要更多的开销)。
使用cpdef
cython将生成两个函数。一个是完全将使用cdef
定义的函数,它还将创建一个python函数,作为此函数的包装器。 cython代码将使用该函数的纯C版本,从而减少开销,并且库将公开包装器。