F2PY 和构建系统#
在本节中,我们将介绍各种流行的构建系统以及它们与 f2py 的使用。
版本已更改 NumPy: 1.26.x
f2py 的默认构建系统传统上是通过增强的 numpy.distutils 模块实现的。该模块基于 distutils,而 distutils 已于 **2023 年 10 月** 从 Python 3.12.0 中移除。与 NumPy 和 SciPy 的其余部分一样,f2py 现在使用 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.cblah-f2pywrappers.f
当不存在
COMMON块时,只生成一个C包装器文件。还会生成包装器来重写假定形状数组为自动数组。- Fortran 90 程序
输入文件
blah.f90生成
blahmodule.cblah-f2pywrappers.fblah-f2pywrappers2.f90
f90包装器用于处理被细分为模块的代码。f包装器为函数生成子程序。它将假定形状数组重写为自动数组。- 签名文件
输入文件
blah.pyf生成
blahmodule.cblah-f2pywrappers2.f90(有时)blah-f2pywrappers.f(有时)
签名文件
.pyf不通过文件扩展名指示其语言标准,它们可能根据其内容生成 F90 和 F77 特定包装器;这会将检查生成文件的负担转移给构建系统。
版本已更改 NumPy: 1.22.4
f2py 将根据输入文件的 Fortran 标准(F77 或更高版本)确定性地生成包装器文件。--skip-empty-wrappers 可以传递给 f2py,以恢复之前仅在输入所需时生成包装器的行为。
理论上,在掌握以上要求的情况下,任何构建系统都可以适配生成 f2py 扩展模块。这里我们将介绍一些更流行的系统。
注意
make 在现代多语言设置中没有位置,因此不再进一步讨论。