如何在pyx文件中使用python调用函数

时间:2014-01-21 16:03:28

标签: python cython

我是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文件中调用该函数?谢谢!

1 个答案:

答案 0 :(得分:6)

使用cdef 定义的函数不能从python访问。您可以编写它们并在cython代码中使用它们,但它们无法公开。

如果您要公开某个功能,请使用def定义,或使用cpdef定义。

使用def你将创建一个普通的python函数,这意味着在cython代码中使用该函数可能需要更多的转换然后使用cdef(因此需要更多的开销)。

使用cpdef cython将生成两个函数。一个是完全将使用cdef定义的函数,它还将创建一个python函数,作为此函数的包装器。 cython代码将使用该函数的纯C版本,从而减少开销,并且库将公开包装器。