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