Import a cython function: AttributeError: the 'module' object does not have the 'fun' attribute

I wrote a little cython code that

 #t3.pyx from libc.stdlib cimport atoi cdef int fun(char *s): return atoi(s) 

Setup.py setup.py

 from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("t3.pyx")) 

I run setup.py with this command

 python setup.py build_ext --inplace 

It gives me

 Compiling t3.pyx because it changed. Cythonizing t3.pyx running build_ext building 't3' extension x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict- prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector- strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c t3.c -o build/temp.linux-x86_64-2.7/t3.o t3.c:556:12: warning: '__pyx_f_2t3_fun' defined but not used [-Wunused-function] static int __pyx_f_2t3_fun(char *__pyx_v_s) { ^ x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z,relro -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/t3.o -o /home/debesh/Documents/cython/t3/t3.so 

When I run the python interpreter, it shows me

 >>> import t3 >>> t3.fun('1234') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute 'fun' >>> 
+5
source share
1 answer

The problem is that you defined your method with cdef instead of def . cdef methods can only be called from cython code.

Detailed information can be found in the Python function against the C-functions in the documents.

Python functions are defined using the def statement, as in Python. They take Python objects as parameters and return Python objects.

Functions

C are defined using the new cdef operator. They take either Python objects or C values ​​as parameters and can return either Python objects or C values.

and the important part:

Inside a Cython module, Python functions and C functions can call each other freely, but only Python functions can be called from outside the module interpreted by the Python code. So, any functions that you want to β€œexport” from your Cython module should be declared as Python functions using def.

+5
source

All Articles