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
相关产品推荐
相关产品推荐

