为什么我在Cython下会收到此警告?

时间:2017-01-19 18:26:08

标签: cython

我尝试在Cython教程中重现一些例子来学习Cython:

http://docs.cython.org/en/latest/src/tutorial/external.html

我认为以下两个警告无关。因此有两个问题:

(1)

将此作为

的输入
  

python setup.py build_ext --inplace -c mingw32

from libc.math cimport sin

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


cpdef double f(double x):
    return sin(x*x)

cpdef test(double x):
    return f(x)

我明白了:

D:\python\cython>python setup.py build_ext --inplace -c mingw32
Compiling primes.pyx because it changed.
[1/1] Cythonizing primes.pyx
warning: primes.pyx:4:19: Function signature does not match previous declaration
running build_ext
building 'primes' extension
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python34\include -IC:\Python34\include -c primes.c -o build\temp.win32-3.4\Release\primes.o
writing build\temp.win32-3.4\Release\primes.def
C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-3.4\Release\primes.o build\temp.win32-3.4\Release\primes.def -LC:\Python34\libs -LC:\Python34\PCbuild -lpython34 -lmsvcr100 -o D:\python\cython\primes.pyd

D:\python\cython>

为什么警告"功能签名与之前的声明不匹配" ?

(2)

当我宣布

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

我收到了额外的警告

warning: primes.pyx:4:20: Function 'sin' previously declared as 'cpdef'

然而,它的确与第34章中的例子完全相同;外部声明"链接页面。在导入模块的python模块中,在包下不知道sin。问题在哪里?

教程中的描述是:

Note that you can easily export an external C function from your Cython module by declaring it as cpdef. This generates a Python wrapper for it and adds it to the module dict. 

1 个答案:

答案 0 :(得分:1)

教程的不同部分显示不同的方式来调用C函数。

对于某些提供了Cython .pxd标头的函数,您可以使用from libc.math import sin。对于所有库,您可以使用.h标头和重新声明的更长的方法。

然而,你不能混合两者,因为它创建了相同功能的两个定义,即使它们是相同的。