我有一个简单的fortran
子例程(仅用于测试python-fortran
接口)。它看起来像这样:
subroutine sum2(x,y,z)
real(kind=8),intent(in)::x,y
real(kind=8),intent(inout)::z
z = x + y
print *, "sum is ", z
end subroutine sum2
使用f2py
编译后,我转到python并执行以下操作:
>>> import sum2
>>> x = 1.0
>>> y = 2.0
>>> z = 0.0
>>> sum2.sum2(x,y,z)
sum is 3
>>> z
0.0
因此,即使z
指定为inout
,其值也不会被函数更改。我需要知道原因。另一个问题涉及notebook
。如果我在那里导入sum2
并运行sum2.sum2(x,y,z)
,我甚至看不到消息sum is ...
。那么,问题是,如果可以在笔记本中调用fortran子程序吗?
修改
有一个合理的评论,在我的例子中我使用了不可变数据类型。所以,我决定改变它,但我仍然有同样的问题。所以,我的新fortran
子程序如下所示:
subroutine arr(x)
real(kind=8),dimension(1)::x
x(1) = 2 ! new value
print *, "x[0] = ", x(1)
end subroutine arr
再次,我用f2py
编译它并转到python:
>>> import arr
>>> x = [1]
>>> arr.arr(x)
x[0] = 2.000000000
>>> x
[1]
所以,即使我现在使用可变类型的数据,我仍然遇到同样的问题 - 我无法在python
和fortran
代码之间传递变量(或者它更好说,我有一条路。)
答案 0 :(得分:6)
为了在Fortran和Python之间正确连接,围绕Fortran的C包装器需要numpy数组。
根据f2py(http://docs.scipy.org/doc/numpy-dev/f2py/getting-started.html#the-quick-way)入门教程中的注释,您最好传递一个兼容数据类型的numpy数组。对于real(kind = 8),这是np.float64。
对于sum2子例程,以下代码对我有用:
>>> import sum2
>>> import numpy as np
>>> x=np.array(1.0,dtype=np.float64)
>>> y=np.array(2.0,dtype=np.float64)
>>> z=np.array(0.0,dtype=np.float64)
>>> sum2.sum2(x,y,z)
sum is 3.0000000000000000
>>> z
array(3.0)
>>>