1 从 meson
迁移#
根据 numpy.distutils 的状态和迁移建议 中规定的时间表,distutils
已不再是 f2py
的默认构建后端。此页面收集了两种格式中的常见工作流程。
注意
这是一个**动态**文档,非常欢迎拉取请求!
1.1 基线#
我们将从经典斐波那契数列生成器的稍微现代化的变体开始。
! fib.f90
subroutine fib(a, n)
use iso_c_binding
integer(c_int), intent(in) :: n
integer(c_int), intent(out) :: a(n)
do i = 1, n
if (i .eq. 1) then
a(i) = 0.0d0
elseif (i .eq. 2) then
a(i) = 1.0d0
else
a(i) = a(i - 1) + a(i - 2)
end if
end do
end
这不会赢得任何奖项,但可以作为合理的起点。
1.2 编译选项#
1.2.1 基本用法#
这没有改变
python -m numpy.f2py -c fib.f90 -m fib
❯ python -c "import fib; print(fib.fib(30))"
[ 0 1 1 2 3 5 8 13 21 34
55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811 514229]
1.2.2 指定后端#
python -m numpy.f2py -c fib.f90 -m fib --backend distutils
这是 Python 3.12 之前的版本的默认值。
python -m numpy.f2py -c fib.f90 -m fib --backend meson
这是 Python 3.12 之后版本的唯一选项。
1.2.3 传递编译器名称#
python -m numpy.f2py -c fib.f90 -m fib --backend distutils --fcompiler=gfortran
FC="gfortran" python -m numpy.f2py -c fib.f90 -m fib --backend meson
也可以使用原生文件。
类似地,在两种情况下都可以使用CC
来设置C
编译器。由于环境变量通常在两者之间非常常见,因此下面包含一个小样本。
名称 |
作用 |
FC |
Fortran 编译器 |
CC |
C 编译器 |
CFLAGS |
C 编译器选项 |
FFLAGS |
Fortran 编译器选项 |
LDFLAGS |
链接器选项 |
LDLIBRARYPATH |
库文件位置 (Unix) |
LIBS |
要链接的库 |
PATH |
可执行文件的搜索路径 |
LDFLAGS |
链接器标志 |
CXX |
C++ 编译器 |
CXXFLAGS |
C++ 编译器选项 |
1.2.4 依赖项#
在这里,meson
实际上可以用来更稳健地设置依赖项。
python -m numpy.f2py -c fib.f90 -m fib --backend distutils -llapack
请注意,这种方法在实践中容易出错。
python -m numpy.f2py -c fib.f90 -m fib --backend meson --dep lapack
这映射到 dependency("lapack")
,因此可用于各种依赖项。它们可以进一步定制以使用 CMake 或其他系统来解决依赖项。
1.2.5 库#
meson
和 distutils
都能够链接库。
python -m numpy.f2py -c fib.f90 -m fib --backend distutils -lmylib -L/path/to/mylib
python -m numpy.f2py -c fib.f90 -m fib --backend meson -lmylib -L/path/to/mylib
1.3 自定义构建#
python -m numpy.f2py -c fib.f90 -m fib --backend distutils --build-dir blah
这可以在技术上与其他代码集成,请参见 通过 numpy.distutils 使用。
python -m numpy.f2py -c fib.f90 -m fib --backend meson --build-dir blah
生成的构建可以通过Meson 构建操作指南进行自定义。事实上,生成的这套文件甚至可以直接提交,并在单独的代码库中用作 meson 子项目。