2014-09-11 22 views
23

Tôi đang chuyển đổi một memoryview Cython đến một mảng NumPy (để có thể sử dụng nó trong mã Python tinh khiết):Cython NumPy cảnh báo về NPY_NO_DEPRECATED_API khi sử dụng MemoryView

from libc.stdlib cimport realloc 
cimport numpy as np 

DTYPE = np.float64 
ctypedef np.float64_t DTYPE_t 

cpdef np.ndarray[DTYPE_t] compute(DTYPE_t[:,::1] data): 
    cdef unsigned int Nchannels = data.shape[0] 
    cdef unsigned int Ndata = data.shape[1] 
    cdef DTYPE_t* output = NULL 
    cdef DTYPE_t[::1] mv 

    output = <DTYPE_t*>realloc(output, Ndata*sizeof(output)) 
    if not output: 
     raise MemoryError() 
    mv = <DTYPE_t[:Ndata]>output 
    mv[10:Ndata-10] = 0.0 
    # various calculations... 
    return np.asarray(mv, dtype=DTYPE, order='C') 

Nó biên dịch, nhưng trình biên dịch cho những điều sau cảnh báo:

/Users/vlad/anaconda/lib/python2.7/site-packages/numpy/core/include 
/nump/npy_1_7_deprecated_api.h:15:2: warning: 
"Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings] 

tôi đã thêm các chỉ thị đề xuất trong setup.py:

from distutils.core import setup, Extension 
from Cython.Build import cythonize 
import numpy 

filename = 'agents3.pyx' 

agents_module = Extension(
    'Agents', 
    sources = [filename], 
    define_macros = [('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')], 
    include_dirs = [numpy.get_include()], 
) 

setup (name = 'Agents', 
    ext_modules = cythonize(agents_module) 
) 

Không w nó sẽ không biên dịch, nó nói:

Vlads-MacBook-Pro:program vlad$ python setup.py build_ext --inplace 
Compiling agents3.pyx because it changed. 
Cythonizing agents3.pyx 
running build_ext 
building 'Agents' extension 
gcc -fno-strict-aliasing -I/Users/vlad/anaconda/include -arch x86_64 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -I/Users/vlad/anaconda/lib/python2.7/site-packages/numpy/core/include -I/Users/vlad/anaconda/include/python2.7 -c agents3.c -o build/temp.macosx-10.5-x86_64-2.7/agents3.o 
agents3.c:2273:52: error: use of undeclared identifier 'NPY_C_CONTIGUOUS' 
    __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); 
               ^
agents3.c:2311:52: error: use of undeclared identifier 'NPY_F_CONTIGUOUS' 
    __pyx_t_1 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); 
               ^
agents3.c:2474:42: error: no member named 'descr' in 'struct tagPyArrayObject' 
    __pyx_t_4 = ((PyObject *)__pyx_v_self->descr); 
          ~~~~~~~~~~~~^
agents3.c:4026:27: error: no member named 'base' in 'struct tagPyArrayObject' 
    Py_XDECREF(__pyx_v_arr->base); 
      ~~~~~~~~~~~^
/Users/vlad/anaconda/include/python2.7/object.h:823:34: note: expanded from macro 'Py_XDECREF' 
#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) 
           ^
agents3.c:4026:27: error: no member named 'base' in 'struct tagPyArrayObject' 
    Py_XDECREF(__pyx_v_arr->base); 
      ~~~~~~~~~~~^
/Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro 'Py_XDECREF' 
#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) 
                  ^
/Users/vlad/anaconda/include/python2.7/object.h:772:24: note: expanded from macro 'Py_DECREF' 
     --((PyObject*)(op))->ob_refcnt != 0)   \ 
        ^
agents3.c:4026:27: error: no member named 'base' in 'struct tagPyArrayObject' 
    Py_XDECREF(__pyx_v_arr->base); 
      ~~~~~~~~~~~^
/Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro 'Py_XDECREF' 
#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) 
                  ^
/Users/vlad/anaconda/include/python2.7/object.h:775:34: note: expanded from macro 'Py_DECREF' 
     _Py_Dealloc((PyObject *)(op));     \ 
           ^
/Users/vlad/anaconda/include/python2.7/object.h:762:15: note: expanded from macro '_Py_Dealloc' 
    (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) 
      ^
/Users/vlad/anaconda/include/python2.7/object.h:115:47: note: expanded from macro 'Py_TYPE' 
#define Py_TYPE(ob)    (((PyObject*)(ob))->ob_type) 
              ^
agents3.c:4026:27: error: no member named 'base' in 'struct tagPyArrayObject' 
    Py_XDECREF(__pyx_v_arr->base); 
      ~~~~~~~~~~~^
/Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro 'Py_XDECREF' 
#define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) 
                  ^
/Users/vlad/anaconda/include/python2.7/object.h:775:34: note: expanded from macro 'Py_DECREF' 
     _Py_Dealloc((PyObject *)(op));     \ 
           ^
/Users/vlad/anaconda/include/python2.7/object.h:762:45: note: expanded from macro '_Py_Dealloc' 
    (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) 
              ^
agents3.c:4035:16: error: no member named 'base' in 'struct tagPyArrayObject' 
    __pyx_v_arr->base = __pyx_v_baseptr; 
    ~~~~~~~~~~~^
agents3.c:4070:30: error: no member named 'base' in 'struct tagPyArrayObject' 
    __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); 
       ~~~~~~~~~~~^
agents3.c:4093:44: error: no member named 'base' in 'struct tagPyArrayObject' 
    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); 
           ~~~~~~~~~~~^
agents3.c:1065:37: note: expanded from macro '__Pyx_INCREF' 
    #define __Pyx_INCREF(r) Py_INCREF(r) 
            ^
/Users/vlad/anaconda/include/python2.7/object.h:767:18: note: expanded from macro 'Py_INCREF' 
    ((PyObject*)(op))->ob_refcnt++) 
       ^
agents3.c:4094:41: error: no member named 'base' in 'struct tagPyArrayObject' 
    __pyx_r = ((PyObject *)__pyx_v_arr->base); 
          ~~~~~~~~~~~^
11 errors generated. 
error: command 'gcc' failed with exit status 1 
Vlads-MacBook-Pro:program vlad$ 

Tôi nên làm gì? Có OK để rời khỏi cuộc gọi API không được chấp nhận vì nó không? Nó cố gắng để acces trường base - nhưng tôi không làm điều đó, đó là lỗi của Cython. Tôi chỉ đơn giản là chuyển đổi một bộ nhớ để một mảng numpy. Có cách nào khác, sạch hơn/an toàn hơn để làm việc đó không?

+2

FWIW, tôi nhận được cùng cảnh báo. Nó vẫn chưa vỡ bất cứ thứ gì, vì vậy tôi bỏ qua chúng bây giờ. – perimosocordiae

Trả lời

20

Chỉ để tham khảo thêm, cython online docs nói điều này là do Cython đang sử dụng API không dùng nữa, và trong thời gian này, đó chỉ là cảnh báo mà chúng tôi có thể bỏ qua.

+1

Cảm ơn bạn! Tôi đã chọn câu trả lời của bạn bởi vì nó không chỉ là phỏng đoán của bạn, mà bạn còn mang theo bằng chứng. :) – Amenhotep

+0

OK, nhưng cảnh báo được ghi vào stdout, do đó, nó gây phiền nhiễu để lọc. Có thể cấu hình cython để không báo cáo cảnh báo không? – Arthur

+0

@Arthur Nếu bạn đang sử dụng ma thuật cython trong ipython thì bạn có thể sử dụng '%% cython --compile-args = -w' để tắt cảnh báo. – towr

0

Tôi cũng nhận được các cảnh báo tương tự và tôi nói điều đó là bình thường.

Với API C gọn gàng, bạn cần đặt dòng ở phía trước tập lệnh C nếu bạn không thích cảnh báo này, nhưng tất cả những gì bạn làm là yêu cầu trình biên dịch bỏ qua thông báo "không dùng nữa" - dường như nó hoạt động cùng một cách.

Tôi đoán trình biên dịch Cython không đặt dòng mã này khi nó tạo mã C và tôi không nghĩ điều đó quan trọng.

1

Giả sử một điều ước để ẩn cảnh báo không dùng nữa, cờ trình biên dịch sau đây có thể được triển khai bằng clang: extra_compile_args = ['- Wno- # warning'].

Đối với gcc, extra_compile_args = ['- Wno-cpp'] đạt được như nhau.

Tất nhiên điều này cũng ẩn các cảnh báo chỉ thị tiền xử lý khác.

Các vấn đề liên quan