Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python - How to use python call function in pyx file

Tags:

python

cython

I am new to cython.

Now, I am trying to import standard c library and define a simple function in pyx file:

from libc.math cimport sin

cdef double f(double x):
    return sin(x*x)

I compiled with this file:

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
)

and generate a library called demo.so now I am trying to call this "f" function in a python file:

import demo
print demo.f(2)

The compiler said,

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'f'

Does anyone know, how can I call the function in pyx file? thanks!

like image 502
Lbj_x Avatar asked Oct 15 '25 15:10

Lbj_x


1 Answers

Functions defined with cdef cannot be accessed from python. You can write them and use them inside the cython code but they cannot be exposed.

If you want to expose a function either define it with def, or define it using cpdef.

Using def you'll create a normal python function, which means using that function in the cython code might require more conversions then using cdef (and hence more overhead).

Using cpdef cython will generate two functions. One is exactly the function that would be defined using cdef and it will also create a python function that acts as a wrapper for this function. The cython code will use the pure-C version of the function, thus reducing the overhead, and the library will expose the wrapper.

like image 69
Bakuriu Avatar answered Oct 17 '25 05:10

Bakuriu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!