导入cython函数:AttributeError:'module'对象没有属性'fun'

时间:2015-05-14 03:37:34

标签: python cython

我写了一个小cython代码

#t3.pyx
from libc.stdlib cimport atoi

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

setup.py文件是

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

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

我使用此命令运行setup.py

python setup.py build_ext --inplace

这给了我

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

当我在python解释器中运行时,它会显示我

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

1 个答案:

答案 0 :(得分:11)

此处的问题是您使用cdef而非def定义了方法。 cdef方法只能从cython代码中调用。

您可以在文档的Python functions vs. C functions部分找到详细信息。

  

Python函数是使用def语句定义的,就像在Python中一样。   它们将Python对象作为参数并返回Python对象。

     

使用新的cdef语句定义C函数。他们要么采取   Python对象或C值作为参数,并且可以返回Python   对象或C值。

和重要的部分:

  

在Cython模块中,Python函数和C函数可以调用每个函数   其他自由,但只能从外部调用Python函数   模块由解释的Python代码组成。所以,你想要的任何功能   必须将Cython模块中的“export”声明为Python函数   使用def。