You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Appveyor编译含Fortran扩展Python项目遇gnu95编译器未找到错误

解决Appveyor上Python项目Fortran扩展编译失败问题

问题背景

我的Python项目依赖Fortran扩展,此前用Appveyor的Visual Studio 2019镜像编译Windows二进制wheel,操作时先把C:/msys64/mingw64/bin加入PATH,再执行命令python.exe setup.py build_ext --inplace --compiler=mingw32 --fcompiler=gnu95,原本正常运行,现在报错:

numpy.distutils.fcompiler.CompilerNotFound: gnu95: f90 nor f77

根据Appveyor官网说明,C:/msys64应该还存在,怀疑是Fortran编译器路径变更或被移除,求可行解决办法。原.appveyor.yml配置如下:

skip_non_tags: true

image:
  - Visual Studio 2019

environment:
  matrix:
    - PYTHON: "C:/Python37-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python38-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python39-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python310-x64"
      NPVERS: "1.23"
  MINGW_DIR: C:/msys64/mingw64/bin
  LDFLAGS: "-Wl,--default-image-base-low"
  TESTPYPI_USER: AmosEgel
  PYPI_USER: ... my user name
  TESTPYPI_PWD:
    secure: ... my password
  PYPI_PWD:    
    secure: ... my password

clone_depth: 5

init:
  - cmd: set PATH=%MINGW_DIR%;%PATH%

build: off

after_test:
  - "%PYTHON%\\python.exe -m pip install numpy==%NPVERS%"
  - "%PYTHON%\\python.exe -m pip install wheel"
  - "%PYTHON%\\python.exe setup.py prepare"
  - "%PYTHON%\\python.exe setup.py build_ext --inplace --compiler=mingw32 --fcompiler=gnu95 -f"
  - "%PYTHON%\\python.exe setup.py bdist_wheel"
 
artifacts:
  - path: dist\*
  
deploy_script:
  - "%PYTHON%\\python.exe -m pip install twine"
#  - "%PYTHON%\\python.exe -m twine upload -u %TESTPYPI_USER% -p %TESTPYPI_PWD% --repository testpypi --skip-existing dist/*.whl"
  - "%PYTHON%\\python.exe -m twine upload -u %PYPI_USER% -p %PYPI_PWD% --skip-existing dist/*.whl"

可行解决办法

1. 手动安装gfortran编译器

Appveyor的VS2019镜像中,默认可能不再预装gfortran,直接通过MSYS2的pacman命令安装:
修改init步骤,先安装编译器再配置PATH:

init:
  - cmd: C:\msys64\usr\bin\pacman -S --noconfirm mingw-w64-x86_64-gcc-fortran
  - cmd: set PATH=%MINGW_DIR%;%PATH%

2. 适配numpy版本与编译器别名

旧版numpy的distutils对gnu95的识别逻辑可能失效,换成新版本numpy支持的gnu别名,同时升级numpy版本适配新编译器:

  • 修改编译命令中的--fcompiler参数:
%PYTHON%\\python.exe setup.py build_ext --inplace --compiler=mingw32 --fcompiler=gnu -f
  • 对应Python3.10的numpy版本可升级到1.24+,比如把环境变量里的NPVERS改成1.24.3

3. 调整PATH优先级

确保MSYS2的路径在系统默认路径最前面,避免其他同名工具干扰:

init:
  - cmd: set PATH=C:\msys64\mingw64\bin;C:\msys64\usr\bin;%PATH%

4. 切换到MSYS2镜像编译

如果上述方法无效,直接改用Appveyor的MSYS2镜像,在原生MSYS2环境中安装所有依赖:
修改image配置:

image:
  - msys2

然后在init中安装所需工具:

init:
  - cmd: pacman -S --noconfirm python3 python3-pip python3-numpy mingw-w64-x86_64-gcc-fortran

修改后的完整.appveyor.yml示例

skip_non_tags: true

image:
  - Visual Studio 2019

environment:
  matrix:
    - PYTHON: "C:/Python37-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python38-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python39-x64"
      NPVERS: "1.19.3"
    - PYTHON: "C:/Python310-x64"
      NPVERS: "1.24.3"  # 升级numpy版本适配新编译器
  MINGW_DIR: C:/msys64/mingw64/bin
  LDFLAGS: "-Wl,--default-image-base-low"
  TESTPYPI_USER: AmosEgel
  PYPI_USER: ... my user name
  TESTPYPI_PWD:
    secure: ... my password
  PYPI_PWD:    
    secure: ... my password

clone_depth: 5

init:
  - cmd: C:\msys64\usr\bin\pacman -S --noconfirm mingw-w64-x86_64-gcc-fortran
  - cmd: set PATH=%MINGW_DIR%;%PATH%

build: off

after_test:
  - "%PYTHON%\\python.exe -m pip install numpy==%NPVERS%"
  - "%PYTHON%\\python.exe -m pip install wheel"
  - "%PYTHON%\\python.exe setup.py prepare"
  - "%PYTHON%\\python.exe setup.py build_ext --inplace --compiler=mingw32 --fcompiler=gnu -f"  # 修改编译器别名
  - "%PYTHON%\\python.exe setup.py bdist_wheel"
 
artifacts:
  - path: dist\*
  
deploy_script:
  - "%PYTHON%\\python.exe -m pip install twine"
#  - "%PYTHON%\\python.exe -m twine upload -u %TESTPYPI_USER% -p %TESTPYPI_PWD% --repository testpypi --skip-existing dist/*.whl"
  - "%PYTHON%\\python.exe -m twine upload -u %PYPI_USER% -p %PYPI_PWD% --skip-existing dist/*.whl"

内容的提问来源于stack exchange,提问作者Amos Egel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:03:16