使用已弃用的 Numpy API

Arn*_*yal 7 c python numpy python-3.x

我正在编写一个小的 C 函数,它应该加速我在 Python 中拥有的较大应用程序的一些计算密集型部分。自然地,我编写了一个包装器来确保我的 C 代码可以与我的 Python numpy 数组无缝对话。一切都很好,我正在使用以下内容setup.py

from distutils.core import setup, Extension
import numpy

module1 = Extension('my_wrapper', 
    sources = ['my_c_file.c'],  
    include_dirs=[numpy.get_include()],
    extra_compile_args = ['-fopenmp'],
    extra_link_args = ['-lgomp'])

setup(name = 'my_wrapper',
    version = '1.0',
    description = 'Some description here',
    ext_modules = [module1])
Run Code Online (Sandbox Code Playgroud)

当我用命令编译它时一切正常python3 setup.py install,代码行为如预期,但我收到以下警告,

warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
#warning "Using deprecated NumPy API, disable it by " \
^
Run Code Online (Sandbox Code Playgroud)

虽然这只是一个警告,但如果可以的话,我仍然想避免这种情况。关于如何做到这一点的任何想法?

adr*_*rin 6

这是一个已知问题,它源于 Cython 历史上支持非常旧的numpy版本这一事实。正如cython's doc提到的:

尽管如此,您仍然会从编译器收到如下警告,因为 Cython 使用的是已弃用的 Numpy API:

.../include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning
"Using deprecated NumPy API, disable it by " "#defining
NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
Run Code Online (Sandbox Code Playgroud)

目前,这只是一个您可以忽略的警告。

但是,有几个拉取请求正在进行中,可以在此处找到跟踪进度的父问题。

很快这些警告就会消失。


Jim*_*ker 6

在上游解决这个问题(如 adrin 提到的)之前,我找到了一种将预处理器符号插入NPY_NO_DEPRECATED_API代码中的方法setup.py,以便抑制警告。将关键字添加define_macros=[args]到您的Extension. 仅将其放入 .h、.cpp 或 .pyx 文件中不会有帮助,因为自动生成的项目 .cpp 文件将看不到预处理器定义。 https://docs.python.org/2.0/dist/node13.html

特别针对OP的情况:

module1 = Extension('my_wrapper', sources = ['my_c_file.c'],  
    include_dirs=[numpy.get_include()],
    extra_compile_args = ['-fopenmp'],
    extra_link_args = ['-lgomp']),
    define_macros=[('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')])
Run Code Online (Sandbox Code Playgroud)

这将添加-DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION到编译行。

公平警告:这样做可能会启用多个新警告,这些警告由于保持与旧版本的兼容性而被抑制。