使用已弃用的Numpy API

12

我正在编写一个小型的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])

使用命令 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 " \
^

虽然这只是一个警告,但我仍然希望尽可能避免。有什么好的想法吗?


1
你尝试过警告提示的那个东西吗? - user2357112
@user2357112 我在 my_c_file.c 中尝试了 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION,但我不认为这有帮助。 - senior_mle
2个回答

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

Despite this, you will still get warnings like the following from the compiler, because Cython is using a deprecated 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]

For the time being, it is just a warning that you can ignore.

然而,有几个拉取请求正在进行中,跟踪进度的父问题可以在这里找到。

很快这些警告将不复存在。


我没有看到问题中提到Cython。我遇到了同样的问题 - 我没有使用Cython,只是使用纯C编写的CPython扩展模块,并使用gcc编译。甚至没有使用setuptools/distutils。#include <numpy/arrayobject.h>(Numpy: 1.20.2,Python: 3.9.4) - Tobias Bergkvist
@TobiasBergkvist,这并不是关于Cython的问题,而是关于使用已弃用的numpy C-API,该API被生成的Cython代码所使用。如果您自己的C代码使用了已弃用的API,则可以使用新的API代替,并且您可能可以通过查看Cython方面的工作来弄清楚如何做到这一点 :) - adrin

5

直到在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')])

这将会在编译行中添加-DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION

警告:这样做可能会启用一些之前被抑制的新警告,因为它保持了对旧版本的兼容性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接