这是我想在python中调用的Fortran子例程中的一个最小化的片段。任务很简单。第一次调用代码时,值被分配给数组的第一个条目iwk。然后第二次调用子例程,预期的行为是指定的条目不变。在
subroutine testf2py (md,iwk,ndp,nip)
implicit none
integer ndp
!f2py intent(in) :: ndp
integer nip
!f2py intent(in) :: nip
integer iwk(31*ndp + nip)
!f2py intent(in) :: iwk
integer md
!f2py intent(in) :: md
if ( md == 1 ) then
iwk(1) = ndp
end if
print*, iwk(1)
end
(第一次呼叫:md=1,后续呼叫:md>;1)。数组iwk应该在python中分配,并且数组中的值应该在调用之间保持不变。在Fortran中调用此函数可以毫无问题地工作:
^{pr2}$两个调用的输出:
10
10
在python中,用f2py编译子例程后,它不起作用。iwk中的值发生变化:
import testf2py
import numpy as np
ndp = 10
nip = 10
iwk = np.empty([31*ndp+nip,], dtype=int, order='F')
testf2py.test(1, iwk, ndp, nip)
testf2py.test(2, iwk, ndp, nip)
两个调用的输出:
10
1686728152
第二个数字是随机的。在
我尝试在python中以不同的方式进行分配,np.空的, np.零. 没有帮助。我假设问题在于如何分配iwk数组(因此是问题标题),但不确定。我需要做些什么才能让它生效?最好只更改python脚本,并保留Fortran代码。在
告诉python数组是
intent(in)
:不允许您更改它,并希望更改将被保留。可能你想要
intent(inout)
。在更好的是,忘记
^{pr2}$!f2py intent
直接使用:如果你试图修改一个
intent(in)
变量,编译器会告诉你你错了。在注意在Python中使用正确的}。你也可以在Fortran中控制它(
dtype
,它必须与Fortran类型相对应。通常Fortraninteger
等同于int32
,但有时它可能是{integer*4
,integer(int32)
,…)。在相关问题 更多 >
编程相关推荐