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

4
我正在使用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个回答

3

f2py具有启发式算法来确定编译模块中应该包含什么。您可以通过使用"only"选项来明确指定,例如:

f2py -c -m ff ff.f90 only: test_sub

没有任何选项的情况下输入f2py会给出一个有用的选项列表。根据您的需求,您可能考虑使用Fortran(2003及以上版本)的iso_c_binding功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接