我正在使用 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中管理私人程序的简洁方法是什么?
答案 0 :(得分:2)
f2py具有启发式功能,可以确定要在已编译模块中包含的内容。您可以使用“仅”选项使其具体化,如
中所示f2py -c -m ff ff.f90 only: test_sub
在没有选项的情况下键入f2py会为您提供有用的选项列表。根据您的需要,您可以考虑使用Fortran的iso_c_binding功能(2003及更高版本)。