Skip to main content
 首页 » 编程设计

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

2025年05月04日20kevingrace

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

请您参考如下方法:

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

如果你想公开一个函数,要么用def定义它,要么用cpdef定义它。

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

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