【问题标题】:Using deprecated Numpy API使用已弃用的 Numpy API
【发布时间】:2018-10-10 22:32:23
【问题描述】:

我正在编写一个小型 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 " \
^

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

【问题讨论】:

  • 您是否尝试过警告中所说的内容?
  • @user2357112 我在my_c_file.c 中尝试了#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION,但我认为没有帮助

标签: python c python-3.x numpy


【解决方案1】:

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

尽管如此,您仍然会从 编译器,因为 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]

暂时只是一个警告,可以忽略。

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

这些警告很快就会消失。

【讨论】:

  • 我没有看到任何地方提到 Cython 的问题。我面临同样的问题 - 我没有使用 Cython。只是 CPython 的普通扩展模块,用 C 编写,用 gcc 编译。甚至不使用 setuptools/distutils。 #include <numpy/arrayobject.h>(Numpy:1.20.2,Python:3.9.4)
  • @TobiasBergkvist 这不是关于 Cython,而是关于使用已弃用的 numpy C-API,它由生成的 Cython 代码使用。如果您自己的 C 代码使用已弃用的 API,那么您可以改用新的 API,您可能会通过查看 Cython 方面所做的工作来弄清楚如何做到这一点:)
【解决方案2】:

直到 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 添加到编译行。

公平警告:这样做可能会启用几个新警告,因为它保持与旧版本的兼容性。

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2022-11-09
    • 2022-11-12
    • 1970-01-01
    • 2014-04-02
    • 2019-10-12
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多