Fortran 使用f2py和接口编译模块
我正在尝试用f2py编译一个fortran模块。这是下面的代码Fortran 使用f2py和接口编译模块,fortran,f2py,Fortran,F2py,我正在尝试用f2py编译一个fortran模块。这是下面的代码 module my_log_mod implicit none interface my_log module procedure my_log_array module procedure my_log_vector end interface my_log private ! hides items not listed on public statement
module my_log_mod
implicit none
interface my_log
module procedure my_log_array
module procedure my_log_vector
end interface my_log
private ! hides items not listed on public statement
public :: my_log
contains
subroutine my_log_array(a,res)
double precision, dimension (:,:), intent (in) :: a
double precision, dimension (:,:), intent (out) :: res
where (a>1.0)
res = log(a)
else where
res = 0.D0
end where
end subroutine
subroutine my_log_vector(a,res)
double precision, dimension (:), intent (in) :: a
double precision, dimension (:), intent (out) :: res
where (a>1.0)
res = log(a)
else where
res = 0.D0
end where
end subroutine
end module my_log_mod
我用下面的命令编译
f2py.py -c -m my_log_mod_comp my_log_mod.f90
它会导致以下错误
C:\Users\weisshau\AppData\Local\Temp\tmpf0apqa7s\src.win32-3.6\my_log_mod_comp-f2pywrappers2.f90:7:28:
use my_log_mod, only : my_log_array
1
Error: Symbol 'my_log_array' referenced at (1) not found in module 'my_log_mod'
C:\Users\weisshau\AppData\Local\Temp\tmpf0apqa7s\src.win32-3.6\my_log_mod_comp-f2pywrappers2.f90:18:28:
use my_log_mod, only : my_log_vector
1
Error: Symbol 'my_log_vector' referenced at (1) not found in module 'my_log_mod'
我对fortran和f2py不太了解,所以我不知道发生了什么。如果我在纯fortran中使用该模块,它工作得很好F2py似乎正在创建另一个使用模块中的子例程的包装器代码 但是它直接调用子例程
my\u log\u vector
和my\u log\u array
。f2py似乎不支持private
。我会删除私有
还要准备好,您将无法在Python中使用通用的my_log
。泛型的这一概念与Python是格格不入的。如果删除private
不能使通用接口可编译,则可能需要删除该接口。你肯定应该删除public::my_log
不幸的是,f2py不支持现代Fortran的所有功能
我测试的代码是:
module my_log_mod
implicit none
interface my_log
module procedure my_log_array
module procedure my_log_vector
end interface my_log
contains
subroutine my_log_array(a,res)
double precision, dimension (:,:), intent (in) :: a
double precision, dimension (:,:), intent (out) :: res
where (a>1.0)
res = log(a)
else where
res = 0.D0
end where
end subroutine
subroutine my_log_vector(a,res)
double precision, dimension (:), intent (in) :: a
double precision, dimension (:), intent (out) :: res
where (a>1.0)
res = log(a)
else where
res = 0.D0
end where
end subroutine
end module my_log_mod
汇编:
f2py -c -m my_log_mod_comp my_log_mod.f90
...
Post-processing...
Block: my_log_mod_comp
Block: my_log_mod
Block: my_log
Block: my_log_array
Block: my_log_vector
Post-processing (stage 2)...
Block: my_log_mod_comp
Block: unknown_interface
Block: my_log_mod
Block: my_log_array
Block: my_log_vector
Building modules...
Building module "my_log_mod_comp"...
Constructing F90 module support for "my_log_mod"...
Creating wrapper for Fortran subroutine "my_log_array"
res = my_log_array(a)
res = my_log_array(a)
Creating wrapper for Fortran subroutine "my_log_vector"("my_log_vector")...
Constructing wrapper function "my_log_mod.my_log_vector"...
res = my_log_vector(a)
Wrote C/API module "my_log_mod_comp" to file "/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_compmodule.c"
Fortran 90 wrappers are saved to "/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.f90"
...
gfortran:f90: /tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.f90
/usr/bin/gfortran -Wall -g -Wall -g -shared /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_compmodule.o /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/fortranobject.o /tmp/tmp7e5v0u/my_log_mod.o /tmp/tmp7e5v0u/tmp/tmp7e5v0u/src.linux-x86_64-2.7/my_log_mod_comp-f2pywrappers2.o -L/usr/lib64 -lpython2.7 -lgfortran -o ./my_log_mod_comp.so
Removing build directory /tmp/tmp7e5v0u
非常感谢你的回答。我尝试了你的两个建议,但仍然不起作用。也许我应该把我的问题扩大到:“我如何编写一个fortran子程序,将任意数组作为输入和输出,并与f2py一起使用?”它在我的计算机上工作。至少使用您提供的代码。解释它不起作用。这句话没有任何意义。你是什么意思?“我如何编写一个fortran子程序,将任意数组作为输入和输出,并将其与f2py一起使用?”你不知道。这就是我在回答中的要点。我尝试删除接口块后的两行,并同时删除接口块,但总是失败,错误与我的问题相同。第二点:知道这一点很好,但这不是f2py的一个很大的缺点吗?您可以在Python中为这两者创建一个包装器。Python使用duck类型,Fortran使用带有特定子例程的泛型。这两种方法不兼容。可以想象f2py为您创建了这个包装器,但事实并非如此。我重复我的回答:不幸的是,f2py不支持现代Fortran的所有功能。