我正在尝试通过使用包装f2py来修改Fortran代码中的Numpy字符串数组的内容。我总是有错误:
ValueError: Failed to initialize intent (inout) array -- input 'c' not compatible to c.
这是我的代码:
module1.f90
module module1
implicit none
contains
subroutine sub1(ddtype,nstr)
integer,intent(in)::nstr
character,intent(inout),dimension(2,nstr)::ddtype
!f2py integer,intent(in)::nstr
!f2py character,intent(inout),dimension(2,nstr)::ddtype
ddtype(1,1) = 'X'
write(*,*) 'From Fortran: ',ddtype
end subroutine sub1
end module module1
python测试: testPython.py
import numpy as np
import Test
arg1 = np.array(['aa','bb','cc'],dtype='c').T
Test.module1.sub1(arg1,arg1.shape[1])
print arg1
我在Linux CentOS 7中,并使用gfortran,f2py和Python 2.7。 我使用以下方法进行编译:
f2py -c -m Test module1.f90
仅当将intent (inout)
更改为(in)
时,才能打印NumPy字符串数组。通常,带有字符串数组的f2py行为似乎不清楚/稳定。
答案 0 :(得分:1)
我以最明显的方式从question I already linked修改了示例,并且效果很好:
subroutine testa4(strvar) bind(C)
use iso_c_binding
implicit none
character(len=1,kind=c_char), intent(inout) :: strvar(2,3)
!character*2 does not work here - why?
strvar(:,1) = ["a", "b"]
strvar(:,2) = ["c", "d"]
strvar(:,2) = ["e", "f"]
end subroutine testa4
编译:
gfortran -shared -fPIC testa5.f90 -o testa5.so
和
import numpy as np
import ctypes
testa4 = ctypes.CDLL("./testa5.so")
strvar = np.asarray(['aa','bb','cc'], dtype = np.dtype('a2'))
strvar_p = ctypes.c_void_p(strvar.ctypes.data)
testa4.testa4(strvar_p)
print(strvar)
运行
> python test.py
['ab' 'ef' 'cc']
f2py当时对我不起作用,所以我什至现在都没有去尝试它。我确实尝试调整AMacK的f2py答案,但遇到了同样的错误。我只会使用ctypes。