使用F2PY

f2py可以用作命令行工具 f2py 或者作为python模块 numpy.f2py . 虽然我们尝试将命令行工具作为numpy安装程序的一部分进行安装,但是一些平台(如Windows)使得在 PATH . 我们会提到 f2py 但您可能必须将其作为模块运行:

python -m numpy.f2py

如果你跑 f2py 没有参数,行 numpy Version 最后与从 python -m numpy.f2py ,然后可以使用较短的版本。如果没有,或者你不能跑步 f2py ,您应该替换所有对 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(in skip: .. : 部分)。

    如果 <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语句插入包装函数之前。此功能允许使用任意C函数(在 <includefile> )在f2py生成的包装中。

    注解

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

    --[no-]wrap-functions

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

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

    搜索包含给定目录中的文件。

    --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源代码以获取例行签名来构造扩展模块。

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

    --help-fcompiler

    列出可用的Fortran编译器。

    --help-compiler [折旧的]

    列出可用的Fortran编译器。

    --fcompiler=<Vendor>

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

    --f77exec=<path>

    指定F77编译器的路径

    --fcompiler-exec=<path> [折旧的]

    指定F77编译器的路径

    --f90exec=<path>

    指定F90编译器的路径

    --f90compiler-exec=<path> [折旧的]

    指定F90编译器的路径

    --f77flags=<string>

    指定F77编译器标志

    --f90flags=<string>

    指定F90编译器标志

    --opt=<string>

    指定优化标志

    --arch=<string>

    指定特定于体系结构的优化标志

    --noopt

    编译而不优化

    --noarch

    编译时不使用依赖于架构的优化

    --debug

    用调试信息编译

    -l<libname>

    使用类库 <libname> 链接时。

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

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

    -U<macro>

    定义宏 <macro>

    -I<dir>

    追加目录 <dir> 搜索包含文件的目录列表。

    -L<dir>

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

    link-<resource>

    链接扩展模块,其定义为 numpy_distutils/system_info.py . 例如,要链接到优化的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)。

--[no-]lower

做 [not] 把箱子放低 <fortran files> . 默认情况下, --lower 假定为 -h 开关,以及 --no-lower 没有 -h 开关。

--build-dir <dirname>

所有f2py生成的文件都创建在 <dirname> tempfile.mkdtemp() .

--quiet

安静地跑。

--verbose

跑得格外冗长。

-v

打印f2py版本ID并退出。

执行 f2py 没有任何选项来获取可用选项的最新列表。

Python模块 numpy.f2py

警告

当前的python接口 f2py 模块不成熟,将来可能会改变。

Fortran到Python接口生成器。

numpy.f2py.compile(source, modulename='untitled', extra_args='', verbose=True, source_fn=None, extension='.f', full_output=False)[源代码]

使用f2py从Fortran 77源字符串构建扩展模块。

参数
sourceSTR或字节

要编译的模块/子例程的Fortran源

在 1.16.0 版更改: 接受str和字节

modulename可选的STR

编译后的python模块的名称

extra_argsstr或list,可选

传递给f2py的其他参数

在 1.16.0 版更改: 还可以提供参数列表。

verbose可选的布尔

将f2py输出打印到屏幕

source_fn可选的STR

写入Fortran源的文件的名称。默认情况下,使用扩展名由 extension 参数

extension“.f”、“.f90”,可选

文件扩展名if source_fn 未提供。扩展说明使用了哪种Fortran标准。默认值为 f ,这意味着F77标准。

1.11.0 新版功能.

full_output可选的布尔

如果为True,则返回 subprocess.CompletedProcess 而不是只包含stdout的stdour进程。

1.20.0 新版功能.

返回
结果 :int或 subprocess.CompletedProcessINT或

成功时为0,或 subprocess.CompletedProcess 如果 full_output=True

实例

>>> import numpy.f2py
>>> fsource = '''
...       subroutine foo
...       print*, "Hello world!"
...       end 
... '''
>>> numpy.f2py.compile(fsource, modulename='hello', verbose=0)
0
>>> import hello
>>> hello.foo()
 Hello world!
numpy.f2py.run_main(comline_list)[源代码]

相当于运行:

f2py <args>

在哪里? <args>=string.join(<list>,' ') 但在python中。除非 -h 此函数返回一个字典,其中包含有关生成的模块及其对源文件的依赖关系的信息。例如,命令 f2py -m scalar scalar.f 可以从python执行,如下所示

不能使用此函数生成扩展模块,即使用 -c 不允许。使用 compile 命令代替

实例

>>> 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']}}