目录

上一主题

在Python中使用F2PY绑定

下一主题

使用numpy.distutils

Using F2PY

F2PY可以用作命令行工具f2py或作为Python模块f2py2e

Command f2py

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

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

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

    注意,Fortran源文件可以包含许多例程,不一定所有的例程都需要从Python中使用。所以,你可以指定哪些例程应该包装( ... 例程F2PY应忽略(在skip: ... part)。

    如果<filename.pyf>被指定为stdout,那么签名会发送到标准输出,而不是文件。

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

    --overwrite-signature

    覆盖现有签名文件。

  2. 要构建扩展模块,请使用

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

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

    这里&lt; fortran 文件&gt;也可能包含签名文件。在其他选项(见下文)中,以下选项可用于此模式:

    --debug-capi

    向扩展模块添加调试挂钩。当使用此扩展模块时,关于包装器的各种信息被打印到标准输出,例如变量的值,所采取的步骤等。

    -include'<includefile>'

    将CPP #include语句添加到扩展模块源。<includefile>应以下列其中一种形式提供:

    "filename.ext"
    <filename.ext>
    

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

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

    --[no-]wrap-functions

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

    - include-paths &lt; path1&gt;:&lt; path2&gt;:..

    从给定目录搜索包含文件。

    - help-link [&lt; list of t> resources names&gt; t5>

    列出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> ]
    

    If <fortran files> contains a signature file, then a source for an extension module is constructed, all Fortran and C sources are compiled, and finally all object and library files are linked to the extension module <modulename>.so which is saved into the current directory.

    If <fortran files> does not contain a signature file, then an extension module is constructed by scanning all Fortran source codes for routine signatures.

    除了其他选项(参见下文)和上一模式中描述的选项,以下选项可用于此模式:

    --help-fcompiler

    列出可用的Fortran编译器。

    --help-compiler [depreciated]

    列出可用的Fortran编译器。

    --fcompiler=<Vendor>

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

    --f77exec=<path>

    指定F77编译器的路径

    --fcompiler-exec=<path> [depreciated]

    指定F77编译器的路径

    --f90exec=<path>

    指定F90编译器的路径

    --f90compiler-exec=<path> [depreciated]

    指定F90编译器的路径

    --f77flags=<string>

    指定F77编译器标志

    --f90flags=<string>

    指定F90编译器标志

    --opt=<string>

    指定优化标志

    --arch=<string>

    指定架构特定的优化标志

    --noopt

    无优化编译

    --noarch

    无需依赖于arch的优化编译

    --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开关。

    当构建扩展模块时,非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 &lt;模块名称&gt;
扩展模块的名称。默认值为untitled如果使用签名文件(* .pyf),请不要使用此选项。
--[no-]lower
不要降低&lt; fortran 文件&gt;中的情况。By default, --lower is assumed with -h switch, and --no-lower without the -h switch.
- build-dir &lt; dirname&gt;
所有F2PY生成的文件都在<dirname>中创建。默认值为tempfile.mkdtemp()
--quiet
静静地运行。
--verbose
以额外的冗长运行。
-v
打印f2py版本ID并退出。

在没有任何选项的情况下执行f2py可获取最新的可用选项列表。

Python module f2py2e

警告

当前与f2py2e模块的Python接口不成熟,并且可能会根据用户的需求在将来更改。

以下功能由f2py2e模块提供:

run_main(<list>)

相当于运行:

f2py <args>

其中&lt; args&gt; = string.join(&lt; list&gt;,' ')除非使用-h,此函数返回一个字典,其中包含有关生成的模块及其对源文件的依赖性的信息。例如,可以执行命令f2py -m 标量 scalar.f从Python如下

>>> import f2py2e
>>> r=f2py2e.run_main(['-m','scalar','docs/usersguide/scalar.f'])
Reading fortran codes...
        Reading file 'docs/usersguide/scalar.f'
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/f2py2e/src/fortranobject.h'],
         'csrc': ['./scalarmodule.c', 
                  '/home/users/pearu/src_cvs/f2py2e/src/fortranobject.c']}}

你不能用这个函数建立扩展模块,也就是说,不允许使用-c使用compile命令,参见下面。

compile(source, modulename ='untitled', extra_args ='', verbose = 1, source_fn = None)

从Fortran 77源字符串source构建扩展模块。如果成功返回0。注意,这个函数实际上从shell调用f2py -c ...,以确保当前Python进程的安全。例如,

>>> import f2py2e
>>> fsource = '''
...       subroutine foo
...       print*, "Hello world!"
...       end 
... '''
>>> f2py2e.compile(fsource,modulename='hello',verbose=0)
0
>>> import hello
>>> hello.foo()
 Hello world!