F2PY 和构建系统#
在本节中,我们将介绍各种流行的构建系统及其与 f2py 的用法.
在 NumPy 版本发生变更: 1.26.x
f2py 的默认构建系统传统上是通过增强的 numpy.distutils 模块. 该模块基于 distutils ,该模块在 2023 年 10 月的 Python 3.12.0 中已删除. 像 NumPy 和 SciPy 的其余部分一样, f2py 现在使用 meson ,有关更多详细信息,请参见 numpy.distutils 的状态和迁移建议 .
对
f2py的所有更改都在 SciPy 上进行了测试,因此始终支持它们的 CI configuration .
备注
请参阅 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包装器为functions创建subroutines. 它将假定形状数组重写为自动数组.- 签名文件
输入文件
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 在现代多语言设置中没有地位,因此不再进一步讨论.