F2PY 和构建系统#

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

笔记

截至 2021 年 11 月

传统上,默认构建系统F2PY是通过增强numpy.distutils模块实现的。该模块基于该模块,将于2023 年 10 月distutils删除;不支持 Fortran,或者不清楚将来是否会支持。因此,替代方法变得越来越重要。Python 3.12.0setuptoolsF2PY

基本概念

构建包含 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的用途subroutinesfunctions.它将假定的形状数组重写为自动数组。

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

  • 生成:

    • blahmodule.c

    • blah-f2pywrappers2.f90(偶尔)

    • blah-f2pywrappers.f(偶尔)

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

笔记

从 NumPy1.22.4开始,f2py将根据输入文件 Fortran 标准(F77 或更高版本)确定性地生成包装文件。 --skip-empty-wrappers可以传递 来f2py恢复之前仅在输入需要时生成包装器的行为。

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

笔记

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

构建系统#