2017-01-19 6 views
0

я пытаюсь воспроизвести некоторые примеры на уроке Cython узнать Cython:Почему я получаю это предупреждение под Cython?

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

Я думаю, что следующие два предупреждения не связаны. Поэтому два qestions:

(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' 

Однако данное точно таким же образом, как, например, в главе «Внешние деклараций "на связанной странице. В модуле python, где импортируется модуль, грех не известен под пакетом. В чем проблема?

описание в учебнике:

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. 
+0

_ «Я думаю, что два следующих предупреждения не связаны. Поэтому два вопроса:« Один вопрос на вопрос –

ответ

1

различные части учебника показывают различные манеры вызывать функции C.

Для некоторых функций, для которых предусмотрен заголовок Cython .pxd, вы можете использовать from libc.math import sin. Для всех библиотек вы можете использовать более длинный метод заголовка .h и повторного объявления.

Однако вы не можете смешивать два, поскольку он создает два определения одной и той же функции, даже если они идентичны.

+0

Я понимаю. Вторая проблема связана с этим? – michael

+0

Очень вероятно :-) 'Функция 'sin', ранее объявленная как 'cpdef'', также содержит многозначные имена. Вы должны попробовать в любом случае для себя. Еще одно замечание: если вы хотите итеративно протестировать Cython-программирование, вы можете сделать это с помощью ноутбуков Jupyter http://docs.cython.org/en/latest/src/quickstart/build.html?highlight=ipython#using-the -ipython-notebook –

+0

cpdef extern double sin (double x) работает – michael

Смежные вопросы