2015-05-14 13 views
5

ich einen kleinen cython Code geschrieben haben, dieImportieren cython Funktion: Attribute: 'Modul' Objekt hat kein Attribut 'Spaß'

#t3.pyx 
from libc.stdlib cimport atoi 

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

die setup.py Datei ist

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

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

Ich betreibe setup.py mit Dieser Befehl

python setup.py build_ext --inplace 

Das gibt mir

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 

Als ich in der python Interpreter es zeigt mir

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

Für zukünftige Leser, möchten Sie 'cpdef' verwenden nicht' cdef' wenn Sie die Funktion in einem normalen Python-Skript importieren möchten – Jon

Antwort

5

Das Problem hierbei ist, dass Sie Ihre Methode definiert mit cdef statt def. cdef Methoden können nur von cython Code aufgerufen werden.

Detaillierte Informationen finden Sie im Abschnitt Python functions vs. C functions der Dokumentation.

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.

und der wichtige Teil:

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.

Verwandte Themen