Skip to content

fix: add NumPy 2.x and MinGW build support#138

Closed
longtsing wants to merge 1 commit intoCyanideCN:masterfrom
longtsing:master
Closed

fix: add NumPy 2.x and MinGW build support#138
longtsing wants to merge 1 commit intoCyanideCN:masterfrom
longtsing:master

Conversation

@longtsing
Copy link
Copy Markdown
Contributor

修复了 #128

主要解决了:

问题1:使用 NumPy 2.x 环境时导入 PyCINRAD 遇到错误;根本原因:
NumPy 2.0 改变了 C API 的 ABI(Application Binary Interface)
使用 NumPy 1.x 编译的扩展模块无法在 NumPy 2.x 环境中运行
需要使用 NumPy 稳定 API (NPY_1_7_API_VERSION) 来实现跨版本兼容
问题2: MinGW-w64 编译失败
Windows 用户使用 MinGW-w64 编译时遇到错误:

cinrad\_utils.c:414:12: error: enumerator value for '__pyx_check_sizeof_voidp' 
is not an integer constant

根本原因:
Cython 生成的编译时检查代码不符合 C 标准
MinGW GCC 严格遵守标准,拒绝编译
MSVC 编译器较为宽松,可以通过

本次修改通过在 Cython 源文件中使用 NumPy 1.7 稳定 API(NPY_1_7_API_VERSION)实现了对 NumPy 1.20+ 和 2.x 的跨版本兼容性,同时在 setup.py 中添加自动修复逻辑,使用正则表达式删除 Cython 生成的不符合 C 标准的 enum 检查代码,从而解决了 MinGW GCC 编译失败的问题,最终实现了一次编译即可在所有主流平台(Windows MSVC/MinGW、Linux、macOS)和不同 NumPy 版本下正常运行的目标。

Auto-fix Cython C code for MinGW GCC compatibility.
Support both NumPy 1.20+ and 2.x with NPY_1_7_API_VERSION.
Add cross-platform build configuration.
@pysoer
Copy link
Copy Markdown
Contributor

pysoer commented Oct 28, 2025

10.28 已测试在windows10,py3.11的环境下,先安装numpy=0.23,后安装cinrad,导入错误已不再出现。

@longtsing
Copy link
Copy Markdown
Contributor Author

很奇怪,我这边测试是出错,或者您看看numpy 的具体版本呢?

C:\Users\longtsing>mamba create -n rdtest python==3.11 -c conda-forge -y

Looking for: ['python==3.11']

conda-forge/win-64 (check zst)                      Checked  1.1s
conda-forge/noarch (check zst)                     Checked  0.0s
conda-forge/noarch                                 139.5MB @  21.3MB/s  6.5s
conda-forge/win-64                                 222.0MB @   5.1MB/s 43.3s
Transaction

  Prefix: D:\Programs\miniforge3\envs\rdtest

  Updating specs:

   - python==3.11


  Package                 Version  Build               Channel           Size
-------------------------------------------------------------------------------
  Install:
-------------------------------------------------------------------------------

  + tzdata                  2025b  h78e105d_0          conda-forge     Cached
  + ca-certificates      2025.8.3  h4c7d964_0          conda-forge     Cached
  + ucrt             10.0.22621.0  h57928b3_1          conda-forge     Cached
  + vcomp14           14.44.35208  h818238b_31         conda-forge     Cached
  + vc14_runtime      14.44.35208  h818238b_31         conda-forge     Cached
  + vc                       14.3  h41ae7f8_31         conda-forge     Cached
  + vs2015_runtime    14.44.35208  h38c0c73_31         conda-forge     Cached
  + tk                     8.6.13  h2c6b04d_2          conda-forge     Cached
  + openssl                 3.5.1  h725018a_0          conda-forge     Cached
  + libzlib                 1.3.1  h2466b09_2          conda-forge     Cached
  + libsqlite              3.50.4  hf5d6505_0          conda-forge     Cached
  + libffi                  3.4.6  h537db12_1          conda-forge     Cached
  + bzip2                   1.0.8  h2466b09_7          conda-forge     Cached
  + xz                      5.2.6  h8d14728_0          conda-forge     Cached
  + python                 3.11.0  hcf16a7b_0_cpython  conda-forge     Cached
  + wheel                  0.45.1  pyhd8ed1ab_1        conda-forge     Cached
  + setuptools             80.9.0  pyhff2d567_0        conda-forge     Cached
  + pip                      25.2  pyh8b19718_0        conda-forge     Cached

  Summary:

  Install: 18 packages

  Total download: 0 B

-------------------------------------------------------------------------------



Downloading and Extracting Packages:

Preparing transaction: done
Verifying transaction: done
Executing transaction: done

To activate this environment, use

     $ mamba activate rdtest

To deactivate an active environment, use

     $ mamba deactivate


C:\Users\longtsing>mamba activate rdtest

(rdtest) C:\Users\longtsing>pip install numpy==2.2.3
Collecting numpy==2.2.3
  Downloading numpy-2.2.3-cp311-cp311-win_amd64.whl.metadata (60 kB)
Downloading numpy-2.2.3-cp311-cp311-win_amd64.whl (12.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.9/12.9 MB 8.6 MB/s  0:00:01
Installing collected packages: numpy
Successfully installed numpy-2.2.3

(rdtest) C:\Users\longtsing>pip install cinrad
Collecting cinrad
  Using cached cinrad-1.9.2-cp311-cp311-win_amd64.whl.metadata (477 bytes)
Collecting metpy>=0.8 (from cinrad)
  Downloading metpy-1.7.1-py3-none-any.whl.metadata (8.9 kB)
Collecting cartopy>=0.15 (from cinrad)
  Downloading cartopy-0.25.0-cp311-cp311-win_amd64.whl.metadata (6.3 kB)
Collecting pyshp!=2.0.0,!=2.0.1 (from cinrad)
  Downloading pyshp-3.0.2.post1-py3-none-any.whl.metadata (64 kB)
Collecting matplotlib>=2.2 (from cinrad)
  Downloading matplotlib-3.10.7-cp311-cp311-win_amd64.whl.metadata (11 kB)
Collecting vanadis (from cinrad)
  Using cached vanadis-0.0.2-py3-none-any.whl.metadata (201 bytes)
Collecting cinrad-data>=0.1 (from cinrad)
  Using cached cinrad_data-0.1-py3-none-any.whl
Requirement already satisfied: numpy>=1.23 in d:\programs\miniforge3\envs\rdtest\lib\site-packages (from cartopy>=0.15->cinrad) (2.2.3)
Collecting shapely>=2.0 (from cartopy>=0.15->cinrad)
  Downloading shapely-2.1.2-cp311-cp311-win_amd64.whl.metadata (7.1 kB)
Collecting packaging>=21 (from cartopy>=0.15->cinrad)
  Using cached packaging-25.0-py3-none-any.whl.metadata (3.3 kB)
Collecting pyproj>=3.3.1 (from cartopy>=0.15->cinrad)
  Downloading pyproj-3.7.2-cp311-cp311-win_amd64.whl.metadata (31 kB)
Collecting contourpy>=1.0.1 (from matplotlib>=2.2->cinrad)
  Downloading contourpy-1.3.3-cp311-cp311-win_amd64.whl.metadata (5.5 kB)
Collecting cycler>=0.10 (from matplotlib>=2.2->cinrad)
  Using cached cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)
Collecting fonttools>=4.22.0 (from matplotlib>=2.2->cinrad)
  Downloading fonttools-4.60.1-cp311-cp311-win_amd64.whl.metadata (114 kB)
Collecting kiwisolver>=1.3.1 (from matplotlib>=2.2->cinrad)
  Downloading kiwisolver-1.4.9-cp311-cp311-win_amd64.whl.metadata (6.4 kB)
Collecting pillow>=8 (from matplotlib>=2.2->cinrad)
  Downloading pillow-12.0.0-cp311-cp311-win_amd64.whl.metadata (9.0 kB)
Collecting pyparsing>=3 (from matplotlib>=2.2->cinrad)
  Downloading pyparsing-3.2.5-py3-none-any.whl.metadata (5.0 kB)
Collecting python-dateutil>=2.7 (from matplotlib>=2.2->cinrad)
  Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting pandas>=1.4.0 (from metpy>=0.8->cinrad)
  Downloading pandas-2.3.3-cp311-cp311-win_amd64.whl.metadata (19 kB)
Collecting pint>=0.17 (from metpy>=0.8->cinrad)
  Downloading pint-0.25-py3-none-any.whl.metadata (10 kB)
Collecting pooch>=1.2.0 (from metpy>=0.8->cinrad)
  Using cached pooch-1.8.2-py3-none-any.whl.metadata (10 kB)
Collecting scipy>=1.8.0 (from metpy>=0.8->cinrad)
  Downloading scipy-1.16.3-cp311-cp311-win_amd64.whl.metadata (60 kB)
Collecting traitlets>=5.1.0 (from metpy>=0.8->cinrad)
  Downloading traitlets-5.14.3-py3-none-any.whl.metadata (10 kB)
Collecting xarray>=2022.6.0 (from metpy>=0.8->cinrad)
  Downloading xarray-2025.10.1-py3-none-any.whl.metadata (12 kB)
Collecting pytz>=2020.1 (from pandas>=1.4.0->metpy>=0.8->cinrad)
  Using cached pytz-2025.2-py2.py3-none-any.whl.metadata (22 kB)
Collecting tzdata>=2022.7 (from pandas>=1.4.0->metpy>=0.8->cinrad)
  Using cached tzdata-2025.2-py2.py3-none-any.whl.metadata (1.4 kB)
Collecting flexcache>=0.3 (from pint>=0.17->metpy>=0.8->cinrad)
  Using cached flexcache-0.3-py3-none-any.whl.metadata (7.0 kB)
Collecting flexparser>=0.4 (from pint>=0.17->metpy>=0.8->cinrad)
  Using cached flexparser-0.4-py3-none-any.whl.metadata (18 kB)
Collecting platformdirs>=2.1.0 (from pint>=0.17->metpy>=0.8->cinrad)
  Downloading platformdirs-4.5.0-py3-none-any.whl.metadata (12 kB)
Collecting typing-extensions>=4.0.0 (from pint>=0.17->metpy>=0.8->cinrad)
  Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB)
Collecting requests>=2.19.0 (from pooch>=1.2.0->metpy>=0.8->cinrad)
  Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB)
Collecting certifi (from pyproj>=3.3.1->cartopy>=0.15->cinrad)
  Downloading certifi-2025.10.5-py3-none-any.whl.metadata (2.5 kB)
Collecting six>=1.5 (from python-dateutil>=2.7->matplotlib>=2.2->cinrad)
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting charset_normalizer<4,>=2 (from requests>=2.19.0->pooch>=1.2.0->metpy>=0.8->cinrad)
  Downloading charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl.metadata (38 kB)
Collecting idna<4,>=2.5 (from requests>=2.19.0->pooch>=1.2.0->metpy>=0.8->cinrad)
  Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB)
Collecting urllib3<3,>=1.21.1 (from requests>=2.19.0->pooch>=1.2.0->metpy>=0.8->cinrad)
  Using cached urllib3-2.5.0-py3-none-any.whl.metadata (6.5 kB)
Using cached cinrad-1.9.2-cp311-cp311-win_amd64.whl (552 kB)
Downloading cartopy-0.25.0-cp311-cp311-win_amd64.whl (11.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.0/11.0 MB 9.5 MB/s  0:00:01
Downloading matplotlib-3.10.7-cp311-cp311-win_amd64.whl (8.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 9.5 MB/s  0:00:00
Downloading contourpy-1.3.3-cp311-cp311-win_amd64.whl (225 kB)
Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB)
Downloading fonttools-4.60.1-cp311-cp311-win_amd64.whl (2.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 18.5 MB/s  0:00:00
Downloading kiwisolver-1.4.9-cp311-cp311-win_amd64.whl (73 kB)
Downloading metpy-1.7.1-py3-none-any.whl (424 kB)
Using cached packaging-25.0-py3-none-any.whl (66 kB)
Downloading pandas-2.3.3-cp311-cp311-win_amd64.whl (11.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.3/11.3 MB 10.7 MB/s  0:00:01
Downloading pillow-12.0.0-cp311-cp311-win_amd64.whl (7.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 9.0 MB/s  0:00:00
Downloading pint-0.25-py3-none-any.whl (305 kB)
Using cached flexcache-0.3-py3-none-any.whl (13 kB)
Using cached flexparser-0.4-py3-none-any.whl (27 kB)
Downloading platformdirs-4.5.0-py3-none-any.whl (18 kB)
Using cached pooch-1.8.2-py3-none-any.whl (64 kB)
Downloading pyparsing-3.2.5-py3-none-any.whl (113 kB)
Downloading pyproj-3.7.2-cp311-cp311-win_amd64.whl (6.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 11.7 MB/s  0:00:00
Downloading pyshp-3.0.2.post1-py3-none-any.whl (58 kB)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached pytz-2025.2-py2.py3-none-any.whl (509 kB)
Downloading requests-2.32.5-py3-none-any.whl (64 kB)
Downloading charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl (106 kB)
Downloading idna-3.11-py3-none-any.whl (71 kB)
Using cached urllib3-2.5.0-py3-none-any.whl (129 kB)
Downloading certifi-2025.10.5-py3-none-any.whl (163 kB)
Downloading scipy-1.16.3-cp311-cp311-win_amd64.whl (38.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 38.7/38.7 MB 11.3 MB/s  0:00:03
Downloading shapely-2.1.2-cp311-cp311-win_amd64.whl (1.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 18.7 MB/s  0:00:00
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Downloading traitlets-5.14.3-py3-none-any.whl (85 kB)
Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB)
Using cached tzdata-2025.2-py2.py3-none-any.whl (347 kB)
Downloading xarray-2025.10.1-py3-none-any.whl (1.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 17.8 MB/s  0:00:00
Using cached vanadis-0.0.2-py3-none-any.whl (3.8 kB)
Installing collected packages: pytz, cinrad-data, urllib3, tzdata, typing-extensions, traitlets, six, shapely, scipy, pyshp, pyparsing, platformdirs, pillow, packaging, kiwisolver, idna, fonttools, cycler, contourpy, charset_normalizer, certifi, requests, python-dateutil, pyproj, flexparser, flexcache, pooch, pint, pandas, matplotlib, xarray, vanadis, cartopy, metpy, cinrad
Successfully installed cartopy-0.25.0 certifi-2025.10.5 charset_normalizer-3.4.4 cinrad-1.9.2 cinrad-data-0.1 contourpy-1.3.3 cycler-0.12.1 flexcache-0.3 flexparser-0.4 fonttools-4.60.1 idna-3.11 kiwisolver-1.4.9 matplotlib-3.10.7 metpy-1.7.1 packaging-25.0 pandas-2.3.3 pillow-12.0.0 pint-0.25 platformdirs-4.5.0 pooch-1.8.2 pyparsing-3.2.5 pyproj-3.7.2 pyshp-3.0.2.post1 python-dateutil-2.9.0.post0 pytz-2025.2 requests-2.32.5 scipy-1.16.3 shapely-2.1.2 six-1.17.0 traitlets-5.14.3 typing-extensions-4.15.0 tzdata-2025.2 urllib3-2.5.0 vanadis-0.0.2 xarray-2025.10.1

(rdtest) C:\Users\longtsing>python
Python 3.11.0 | packaged by conda-forge | (main, Oct 25 2022, 06:12:32) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cinrad

A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.2.3 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last):  File "<stdin>", line 1, in <module>
  File "D:\Programs\miniforge3\envs\rdtest\Lib\site-packages\cinrad\__init__.py", line 1, in <module>
    from . import io
  File "D:\Programs\miniforge3\envs\rdtest\Lib\site-packages\cinrad\io\__init__.py", line 4, in <module>
    from cinrad.io.base import RadarBase, prepare_file
  File "D:\Programs\miniforge3\envs\rdtest\Lib\site-packages\cinrad\io\base.py", line 13, in <module>
    from cinrad.utils import MODULE_DIR
  File "D:\Programs\miniforge3\envs\rdtest\Lib\site-packages\cinrad\utils.py", line 160, in <module>
    from cinrad._utils import *
>>> exit()

(rdtest) C:\Users\longtsing>python --version
Python 3.11.0

@pysoer
Copy link
Copy Markdown
Contributor

pysoer commented Oct 29, 2025

10.28 已测试在windows10,py3.11的环境下,先安装numpy=0.23,后安装cinrad,导入错误已不再出现。

我是说安装了你这个fix版本的cinrad就没出现导入错误了…

@longtsing longtsing closed this Dec 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants