我写了一个小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'
>>>
答案 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。