F2PY 和构建系统#

在本节中,我们将介绍各种流行的构建系统及其与 f2py 的用法。

NumPy 版本更新:1.26.x

传统上,f2py 的默认构建系统是通过增强的 numpy.distutils 模块。该模块基于 distutils,后者已于 2023 年 10 月Python 3.12.0 中移除。现在,f2py 和 NumPy、SciPy 的其余部分一样,使用 meson,更多详细信息请参阅 numpy.distutils 状态和迁移建议

f2py 的所有更改都在 SciPy 上进行了测试,因此其 CI 配置 始终受到支持。

注意

有关迁移信息,请参阅 1 迁移到 meson

基本概念#

构建包含 Python 和 Fortran 的扩展模块包括:

  • Fortran 源文件

  • 一个或多个由 f2py 生成的文件

    • 始终创建一个 C 封装文件

    • 包含模块的代码需要额外的 .f90 封装

    • 包含函数的代码会生成额外的 .f 封装

  • fortranobject.{c,h}

    • numpy 分发

    • 可以通过 python -c "import numpy.f2py; print(numpy.f2py.get_include())" 查询

  • NumPy 头文件

    • 可以通过 python -c "import numpy; print(numpy.get_include())" 查询

  • Python 库和开发头文件

大体而言,考虑 f2py 的输出时会遇到三种情况:

Fortran 77 程序
  • 输入文件 blah.f

  • 生成

    • blahmodule.c

    • blah-f2pywrappers.f

当不存在 COMMON 块时,只生成 C 封装文件。还会生成封装来将假定形状数组重写为自动数组。

Fortran 90 程序
  • 输入文件 blah.f90

  • 生成

    • blahmodule.c

    • blah-f2pywrappers.f

    • blah-f2pywrappers2.f90

`.f90` 封装用于处理细分为模块的代码。`.f` 封装为 functions 创建 subroutines。它将假定形状数组重写为自动数组。

签名文件
  • 输入文件 blah.pyf

  • 生成

    • blahmodule.c

    • blah-f2pywrappers2.f90(偶尔)

    • blah-f2pywrappers.f(偶尔)

签名文件 .pyf 不通过文件扩展名表明其语言标准,它们可能会根据其内容生成 F90 和 F77 特定的封装;这会将检查生成文件的负担转移到构建系统上。

NumPy 版本更新:1.22.4

f2py 将根据输入文件的 Fortran 标准(F77 或更高版本)确定性地生成封装文件。可以将 --skip-empty-wrappers 传递给 f2py 以恢复以前的行为,即仅在输入需要时才生成封装。

理论上,牢记上述要求,任何构建系统都可以适配以生成 f2py 扩展模块。这里我们将介绍一些更流行的系统。

注意

在现代多语言设置中,make 没有立足之地,因此不再进一步讨论。

构建系统#