2015-05-14 26 views
5

Ho scritto un piccolo codice cython che èImportazione Cython funzione: AttributeError: 'modulo' oggetto non ha attributo 'fun'

#t3.pyx 
from libc.stdlib cimport atoi 

cdef int fun(char *s): 
     return atoi(s) 

il file setup.py è

from distutils.core import setup 
from Cython.Build import cythonize 

setup(ext_modules=cythonize("t3.pyx")) 

corro setup.py utilizzando questo comando

python setup.py build_ext --inplace 

Questo mi dà

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 

Quando eseguo nel python interprete mi

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

Per i lettori futuri, che si desidera utilizzare '' non cpdef' cdef' se si desidera importare la funzione in uno script Python regolare – Jon

risposta

5

mostra il problema qui è che si è definito il metodo con cdef invece di def. I metodi cdef possono essere chiamati solo dal codice cython.

È possibile trovare informazioni dettagliate nella sezione Python functions vs. C functions dei documenti.

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

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

e la parte importante:

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

Problemi correlati