使用 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 没有"每个文件" skip 或 only 列表的概念,因此如果函数在 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 版本发生变更: 现在有两个单独的构建后端可以使用, distutils 和 meson . 强烈建议用户切换到 meson ,因为它是Python 3.12 以上版本的默认设置.
常用构建标志:
--backend <backend_type>指定编译过程的构建后端. 支持的后端为
meson和distutils. 如果未指定,则默认为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-fcompilerno meson列出可用的 Fortran 编译器.
--fcompiler=<Vendor>no meson按供应商指定 Fortran 编译器的类型.
--f77exec=<path>no meson指定 F77 编译器的路径
--f90exec=<path>no meson指定 F90 编译器的路径
--opt=<string>no meson指定优化标志
--arch=<string>no meson指定特定于架构的优化标志
--nooptno meson编译时不使用优化标志
--noarchno meson编译时不使用依赖于架构的优化标志
link-<resource>no 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
有关更多信息,请参阅 Building C and C++ Extensions Python 文档以获取详细信息.
构建扩展模块时,对于非 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 – 至今 NumPy 开发人员. 根据 NumPy 许可证的条款授予使用,修改和分发此软件的许可.
不作任何明示或暗示的保证.使用风险自负.
- numpy.f2py.get_include()[源代码]#
返回包含
fortranobject.c和.h文件的目录.备注
当直接从
.f和/或.pyf文件中一次性使用 numpy.distutils 构建扩展时,不需要此函数.使用 f2py 生成的代码构建的 Python 扩展模块需要使用
fortranobject.c作为源文件,并包含fortranobject.h头文件.此函数可用于获取包含这两个文件的目录.- 返回值:
- include_pathstr
包含
fortranobject.c和fortranobject.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.cmymod-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 版本的 main site-packages 目录的适当权限.为了使生成的包能够工作,您需要创建一个名为 __init__.py 的文件(与 add.pyf 位于同一目录中).请注意,扩展模块完全根据 add.pyf 和 add.f 文件定义..pyf 文件到 .c 文件的转换由 numpy.distutils 处理.