F2py无法编译具有私有函数的模块

时间:2017-04-18 21:01:31

标签: python fortran private python-module f2py

我正在使用 f2py 从Fortran模块构建Python模块。 Fortran模块包含私有过程,需要在Python模块中可用。以下是重现问题的代码示例:

module testmodule

  implicit none

  public :: &
       test_sub

  private :: &
       useful_func

contains

  subroutine test_sub()

    !uses the function
    print*, useful_func(3)

  end subroutine test_sub

  function useful_func(in) result(res)
    integer, intent(in) :: in
    integer :: res

    !Does some calculation
    res=in+1

  end function useful_func

end module testmodule

当我用以下代码编译它时:

f2py -c test.f90 -m test

编译失败,并显示以下错误消息:

gfortran:f90: /tmp/tmpXzt_hf/src.linux-x86_64-2.7/test-f2pywrappers2.f90
/tmp/tmpXzt_hf/src.linux-x86_64-2.7/test-f2pywrappers2.f90:7:28:

       use testmodule, only : useful_func
                            1
Error: Symbol « useful_func » referenced at (1) not found in module « testmodule »

似乎gfortran正试图在模块之​​外使用私有函数,当然这会失败。

删除public / private语句解决了问题(通过公开所有函数),但我觉得这不是一个干净的方法。这些函数不一定要在Python中使用,并且不应该在Python环境中可用。 如果无法修改包含此类声明的Fortran脚本该怎么办?

简而言之:

使用f2py在Fortran中管理私人程序的简洁方法是什么?

1 个答案:

答案 0 :(得分:2)

f2py具有启发式功能,可以确定要在已编译模块中包含的内容。您可以使用“仅”选项使其具体化,如

中所示
f2py -c -m ff ff.f90 only: test_sub

在没有选项的情况下键入f2py会为您提供有用的选项列表。根据您的需要,您可以考虑使用Fortran的iso_c_binding功能(2003及更高版本)。