Python 无法更改并返回Fortran子例程中的值+;笔记本

Python 无法更改并返回Fortran子例程中的值+;笔记本,python,fortran,f2py,Python,Fortran,F2py,我有一个简单的fortran子例程(仅用于测试pythonfortran接口)。看起来是这样的: 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 subroutine arr(x) real(kind=8),dimension(1)::x x(1) =

我有一个简单的
fortran
子例程(仅用于测试
pythonfortran
接口)。看起来是这样的:

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
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 sum2
>>> x = 1.0
>>> y = 2.0
>>> z = 0.0
>>> sum2.sum2(x,y,z)
sum is 3
>>> z
0.0
因此,即使将
z
指定为
inout
,函数也不会更改其值。我需要知道为什么。另一个问题涉及笔记本电脑。如果我在那里导入
sum2
并运行
sum2.sum2(x,y,z)
我甚至看不到一条消息
sum is…
。所以,问题是,是否有可能在笔记本中调用fortran子程序

编辑

有一个合理的评论,在我的示例中,我使用了一个不可变的数据类型。所以,我决定改变它,但我仍然有同样的问题。因此,我的新
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
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
代码之间传递变量(或者说,我有一条单行道更好)

为了在Fortran和Python之间正确接口,Fortran的C包装器需要numpy数组

根据f2py()入门教程中的说明,最好传递一个具有兼容数据类型的numpy数组。对于real(kind=8),这是np.64

对于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)
>>>

为了在Fortran和Python之间正确接口,Fortran的C包装器需要numpy数组

根据f2py()入门教程中的说明,最好传递一个具有兼容数据类型的numpy数组。对于real(kind=8),这是np.64

对于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)
>>>

为什么z
intent(inout)
?在您的示例中,它只是输出。。。它没有改变的原因是python浮点是不可变的。一种解决方法是传入一个1元素数组,然后在另一端解包,但这会非常难看。Fortran代码看起来怎么样?@Vladimir F。请看一下我更新的问题。谢谢也许,编译和运行它的方式也是必要的。我像
f2py-m arr-c arr.f90那样编译它。至于
运行
,我展示了-just arr.arr(x)为什么z
intent(inout)
?在您的示例中,它只是输出。。。它没有改变的原因是python浮点是不可变的。一种解决方法是传入一个1元素数组,然后在另一端解包,但这会非常难看。Fortran代码看起来怎么样?@Vladimir F。请看一下我更新的问题。谢谢也许,编译和运行它的方式也是必要的。我像
f2py-m arr-c arr.f90那样编译它。至于运行
,我展示了-只是arr.arr(x)对,我没有注意到他在第二次试验中使用了常规列表。对,我没有注意到他在第二次试验中使用了常规列表。