1 迁移到 meson#

根据 numpy.distutils 的状态和迁移建议 中列出的时间表,``distutils`` 已不再是 f2py 的默认构建后端.本页收集了两种格式中的常见工作流程.

备注

这是一个 **living** 文档,`pull requests <https://numpy.org/doc/stable/dev/howto-docs.html>`_ 非常受欢迎!

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 编译器.由于环境变量在两者之间通常非常常见,因此下面包含一个小示例.

Name

What

FC

Fortran 编译器

CC

C 编译器

CFLAGS

C 编译器选项

FFLAGS

Fortran 编译器选项

LDFLAGS

链接器选项

LD路径

库文件位置(Unix)

LIBS

要链接的库

路径

可执行文件的搜索路径

LDFLAGS

链接器标志

CXX

C++ 编译器

CXXFLAGS

C++ 编译器选项

备注

对于Windows,这些可能不太可靠,因此 本地文件 可能是最好的选择,或者通过直接 1.3 自定义构建.

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 库#

mesondistutils 都能够链接库.

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 子项目.