使用 F2PY#

本页包含 f2py 命令的所有命令行选项的参考,以及 numpy.f2py 模块的内部函数的参考.

f2py 用作命令行工具#

当作为命令行工具使用时, f2py 具有三种主要模式,通过使用 -c-h 开关区分.

1. 签名文件生成#

要扫描Fortran源代码并生成签名文件,请使用

f2py -h <filename.pyf> <options> <fortran files>   \
  [[ only: <fortran functions>  : ]                \
    [ skip: <fortran functions>  : ]]...           \
  [<fortran files> ...]

备注

Fortran 源文件可能包含许多例程,通常没有必要允许所有例程都可从 Python 中使用.在这种情况下,可以指定应包装哪些例程(在 only: .. : 部分),或者 F2PY 应忽略哪些例程(在 skip: .. : 部分).

F2PY 没有 “per-file” skiponly 列表的概念,因此如果在 only 中列出了函数,则不会从任何其他文件中获取其他函数.

如果将 <filename.pyf> 指定为 stdout ,则签名将写入标准输出而不是文件.

在其他选项(见下文)中,以下内容可以在此模式下使用:

--overwrite-signature

覆盖现有的签名文件.

2. 扩展模块构造#

要构造扩展模块,请使用

f2py -m <modulename> <options> <fortran files>   \
  [[ only: <fortran functions>  : ]              \
    [ skip: <fortran functions>  : ]]...          \
  [<fortran files> ...]

构造的扩展模块保存为 <modulename>module.c 到当前目录.

这里 <fortran files> 也可能包含签名文件.在其他选项(见下文)中,以下选项可以在此模式下使用:

--debug-capi

向扩展模块添加调试钩子.使用此扩展模块时,有关包装器的各种诊断信息将写入标准输出,例如,变量的值,采取的步骤等.

-include'<includefile>'

将 CPP #include 语句添加到扩展模块源. <includefile> 应以以下形式之一给出

"filename.ext"
<filename.ext>

include 语句插入在包装器函数之前.此功能使可以在 F2PY 生成的包装器中使用任意 C 函数(在 <includefile> 中定义).

备注

此选项已弃用.使用 usercode 语句直接在签名文件中指定 C 代码段.

--[no-]wrap-functions

创建 Fortran 子例程包装器到 Fortran 函数. --wrap-functions 是默认设置,因为它确保了最大的可移植性和编译器独立性.

--[no-]freethreading-compatible

创建一个模块,声明它是否需要 GIL.默认值是 --no-freethreading-compatible 以实现向后兼容性.在传递 --freethreading-compatible 之前,请检查您正在包装的 fortran 代码是否存在线程安全问题,因为 f2py 不分析 fortran 代码的线程安全问题.

--include-paths "<path1>:<path2>..."

从给定的目录搜索包含文件.

备注

路径要用操作系统的分隔符分开 pathsep ,在 Linux/MacOS 上是 : ,在 Windows 上是 ; .在 CMake 中,这对应于使用 $<SEMICOLON> .

--help-link [<list of resources names>]

列出由 numpy_distutils/system_info.py 找到的系统资源.例如,尝试 f2py --help-link lapack_opt .

3. 构建模块#

要构建扩展模块,请使用

f2py -c <options> <fortran files>       \
  [[ only: <fortran functions>  : ]     \
    [ skip: <fortran functions>  : ]]... \
  [ <fortran/c source files> ] [ <.o, .a, .so files> ]

如果 <fortran files> 包含签名文件,则构造扩展模块的源,编译所有 Fortran 和 C 源,最后将所有对象和库文件链接到扩展模块 <modulename>.so ,该模块保存到当前目录中.

如果 <fortran files> 不包含签名文件,那么在构建扩展模块之前,会通过扫描所有 Fortran 源代码以获取例程签名,从而构建扩展模块.

警告

从 Python 3.12 开始, distutils 已被移除.请使用环境变量或自带文件来与 meson 交互.更多信息请参见其 FAQ .

在其他选项(见下文)和先前模式描述的选项中,可以使用以下选项.

备注

在 1.26.0 版本发生变更: 现在有两种可以使用的独立构建后端: distutilsmeson .强烈建议用户切换到 meson ,因为它是 Python 3.12 以上版本的默认选项.

通用构建标志:

--backend <backend_type>

指定编译过程的构建后端.支持的后端是 mesondistutils .如果未指定,则默认为 distutils .在 Python 3.12 或更高版本上,默认为 meson .

--f77flags=<string>

指定 F77 编译器标志

--f90flags=<string>

指定 F90 编译器标志

--debug

使用调试信息进行编译

-l<libname>

链接时使用库 <libname> .

-D<macro>[=<defn=1>]

将宏 <macro> 定义为 <defn> .

-U<macro>

定义宏 <macro>

-I<dir>

将目录 <dir> 附加到搜索包含文件的目录列表中.

-L<dir>

将目录 <dir> 添加到要搜索 -l 的目录列表中.

meson 特有的标志是:

--dep <dependency> 仅限 meson

为模块指定一个 meson 依赖项.可以多次传递此选项以指定多个依赖项.依赖项存储在一个列表中以供进一步处理.例如: --dep lapack --dep scalapack 这将识别出 “lapack” 和 “scalapack” 作为依赖项,并将它们从 argv 中移除,留下一个包含 [“lapack”, “scalapack”] 的依赖项列表.

较旧的 distutils 标志是:

--help-fcompiler 无 meson

列出可用的 Fortran 编译器.

--fcompiler=<Vendor> 无 meson

按供应商指定 Fortran 编译器类型.

--f77exec=<path> 无 meson

指定 F77 编译器的路径

--f90exec=<path> 无 meson

指定 F90 编译器的路径

--opt=<string> 无 meson

指定优化标志

--arch=<string> 无 meson

指定特定于架构的优化标志

--noopt 无 meson

编译时不使用优化标志

--noarch 无 meson

编译时不使用依赖于 arch 的优化标志

link-<resource> 无 meson

使用 numpy_distutils/system_info.py 中定义的 <resource> 链接扩展模块.例如,要与优化的 LAPACK 库(MacOSX 上的 vecLib,其他地方的 ATLAS)链接,请使用 --link-lapack_opt .另请参见 --help-link 开关.

备注

f2py -c 选项必须应用于现有的 .pyf 文件(加上源/对象/库文件),或者必须指定 -m <modulename> 选项(加上源/对象/库文件). 使用以下选项之一:

f2py -c -m fib1 fib1.f

f2py -m fib1 fib1.f -h fib1.pyf
f2py -c fib1.pyf fib1.f

更多信息,请参阅 Python 文档 Building C and C++ Extensions 获取详细信息.

在构建扩展模块时,对于非 gcc Fortran 编译器,可能需要以下宏的组合:

-DPREPEND_FORTRAN
-DNO_APPEND_FORTRAN
-DUPPERCASE_FORTRAN

要测试 F2PY 生成接口的性能,请使用 -DF2PY_REPORT_ATEXIT .然后在 Python 退出时,会打印出各种计时报告.此功能可能并非在所有平台上都有效,目前仅支持 Linux.

要查看 F2PY 生成的接口是否执行数组参数的复制,请使用 -DF2PY_REPORT_ON_ARRAY_COPY=<int> .当数组参数的大小大于 <int> 时,会将关于复制的消息发送到 stderr .

其他选项#

-m <modulename>

扩展模块的名称.默认为 untitled .

警告

如果使用了签名文件 ( *.pyf ),请不要使用此选项.

在 1.26.3 版本发生变更: 如果提供了 pyf 文件,将忽略 -m .

--[no-]lower

[不]将 <fortran files> 中的大小写更改为小写.默认情况下,使用 -h 开关时假定为 --lower ,而没有 -h 开关时假定为 --no-lower .

-include<header>

在 C 封装器中写入其他头文件,可以多次传递,每次生成 #include <header>.请注意,这意味着要用单引号引用且没有空格传递,例如 '-include<stdbool.h>'

--build-dir <dirname>

所有 F2PY 生成的文件都创建在 <dirname> 中.默认为 tempfile.mkdtemp() .

--f2cmap <filename>

从给定的文件中加载 Fortran 到 C 的 KIND 规范.

--quiet

静默运行.

--verbose

以更详细的方式运行.

--skip-empty-wrappers

除非输入需要,否则不要生成封装器文件.这是一个向后兼容性标志,用于恢复 1.22.4 之前的行为.

-v

打印 F2PY 版本并退出.

执行 f2py 而不带任何选项,以获得可用选项的最新列表.

Python 模块 numpy.f2py#

警告

在 2.0.0 版本发生变更: 曾经有一个 f2py.compile 函数,它已被删除,用户可以通过 subprocess.run 手动封装 python -m numpy.f2py ,并根据需要设置环境变量以与 meson 交互.

当使用 numpy.f2py 作为模块时,可以调用以下函数.

Fortran 到 Python 接口生成器.

版权所有 1999 – 2011 Pearu Peterson.版权所有 2011 – present NumPy 开发者.根据 NumPy 许可证的条款授予使用,修改和分发此软件的许可.

不作任何明示或暗示的担保.使用风险自负.

numpy.f2py.get_include()[源代码]#

返回包含 fortranobject.c.h 文件的目录.

备注

当直接从 .f 和/或 .pyf 文件使用 numpy.distutils 构建扩展时,不需要此函数.

使用 f2py 生成的代码构建的 Python 扩展模块需要使用 fortranobject.c 作为源文件,并包含 fortranobject.h 头文件.此函数可用于获取包含这两个文件的目录.

返回:
include_pathstr

包含 fortranobject.cfortranobject.h 的目录的绝对路径.

参见

numpy.get_include

返回 numpy 包含目录的函数

注释

在 1.21.1 版本加入.

除非您使用的构建系统对 f2py 有特定的支持,否则使用 .pyf 签名文件构建 Python 扩展是一个两步过程.对于模块 mymod :

  • 第 1 步:运行 python -m numpy.f2py mymod.pyf --quiet .这将在 mymod.pyf 旁边生成 mymodmodule.c 和(如果需要) mymod-f2pywrappers.f 文件.

  • 第 2 步:构建您的 Python 扩展模块.这需要以下源文件:

    • mymodmodule.c

    • mymod-f2pywrappers.f (如果在第 1 步中生成)

    • fortranobject.c

numpy.f2py.run_main(comline_list)[源代码]#

相当于运行:

f2py <args>

其中 <args>=string.join(<list>,' ') ,但在 Python 中.除非使用 -h ,否则此函数返回一个字典,其中包含有关生成的模块及其对源文件的依赖关系的信息.

您不能使用此函数构建扩展模块,即不允许使用 -c .请改用 compile 命令.

示例

命令 f2py -m scalar scalar.f 可以从 Python 中执行,如下所示.

>>> import numpy.f2py
>>> r = numpy.f2py.run_main(['-m','scalar','doc/source/f2py/scalar.f'])
Reading fortran codes...
        Reading file 'doc/source/f2py/scalar.f' (format:fix,strict)
Post-processing...
        Block: scalar
                        Block: FOO
Building modules...
        Building module "scalar"...
        Wrote C/API module "scalar" to file "./scalarmodule.c"
>>> print(r)
{'scalar': {'h': ['/home/users/pearu/src_cvs/f2py/src/fortranobject.h'],
	 'csrc': ['./scalarmodule.c', 
                  '/home/users/pearu/src_cvs/f2py/src/fortranobject.c']}}

自动生成扩展模块#

如果您想分发您的 f2py 扩展模块,那么您只需要包含 .pyf 文件和 Fortran 代码. NumPy 中的 distutils 扩展允许您完全根据此接口文件定义扩展模块.一个有效的 setup.py 文件允许分发 add.f 模块(作为包 f2py_examples 的一部分,以便它被加载为 f2py_examples.add ):

def configuration(parent_package='', top_path=None)
    from numpy.distutils.misc_util import Configuration
    config = Configuration('f2py_examples',parent_package, top_path)
    config.add_extension('add', sources=['add.pyf','add.f'])
    return config

if __name__ == '__main__':
    from numpy.distutils.core import setup
    setup(**configuration(top_path='').todict())

使用以下命令可以轻松安装新软件包:

pip install .

假设您具有写入您正在使用的 Python 版本的主 site- packages 目录的适当权限.为了使生成的包能够工作,您需要创建一个名为 __init__.py 的文件(与 add.pyf 位于同一目录中).请注意,扩展模块完全根据 add.pyfadd.f 文件定义. .pyf 文件到 .c 文件的转换由 numpy.distutils 处理.