Cython教程中的cpdef不起作用

时间:2016-05-25 19:00:09

标签: cython

我是cython的新手。我有一个源代码文件hello.pyx

cdef extern from "math.h":
     cpdef double sin(double x)

,我的setup.py文件是:

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

ext_modules=[
    Extension("hello",
              sources=["hello.pyx"],
              libraries=["m"] # Unix-like specific
    )
]

setup(
name = "Demos",
ext_modules = cythonize(ext_modules)
)

然后我把它编译成.so

但是,当我import hello时,我没有得到hello.sin函数。

那么“这是一个Cython模块可以直接访问Python代码的C sin()函数的目的是什么:”在教程中写的?

我正在关注外部声明的official tutorial

运行cythoning的结果:

Compiling hello.pyx because it changed.
Cythonizing hello.pyx
running build_ext
building 'hello' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall-Wstrict-prototypes -fPIC -I/pool/software/python/python27plus-ibm/include/python2.7 -c hello.c -o build/temp.linux-x86_64-2.7/hello.o
gcc -pthread -shared build/temp.linux-x86_64-2.7/hello.o -L/proj/dist/sandbox/miniconda/lib -lm -lpython2.7 -o /home/shaowu/Documents/cython_play/hello.so

2 个答案:

答案 0 :(得分:1)

正如@DavidW所说,这很可能是因为你使用的是旧版本的Cython。在版本< 0.22您的setup.py脚本,根据文档should look like this

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules=[
    Extension("demo",
              ["demo.pyx"],
              libraries=["m"]) # Unix-like specific
]

setup(
  name = "Demos",
  cmdclass = {"build_ext": build_ext},
  ext_modules = ext_modules
)

要么使用它,要么最好使用install the latest version

答案 1 :(得分:0)

我的笔记本电脑没问题,这是我做的步骤:

  • cd到包含hello.pyxsetup.pytest.py
  • 的目录
  • python setup.py build_ext --inplace
  • python test.py

返回:

['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__test__', 'sin']
0.479425538604203

test.py包含:

import hello

print(dir(hello))
print(hello.sin(0.5))