我是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
答案 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.pyx
,setup.py
和test.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))