假设我有一个要通过f2py
编译的模块:
test.f90
module test
implicit none
integer, parameter :: q = 2
real(8), parameter, dimension(-q:q) :: vec = (/ 1, 2, 3, 4, 5 /)
contains
subroutine writevec()
write(*,*) vec
end subroutine
end module
运行f2py -c -m test test.f90
后,我收到错误
/tmp/tmp6X6gsD/src.linux-x86_64-2.7/testmodule.c:176:17: error: expected expression before ‘)’ token
{"vec",1,{{-(-)+1}},NPY_DOUBLE},
另一方面,如果我使用vec
声明dimension(2*q+1)
,则可行。有点。当我导入到python:
>>> from test import test
>>> test.writevec()
>>> 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000
>>> test.vec
>>> array([ 1., 2.]) # ???
这里发生了什么?
答案 0 :(得分:0)
您可以创建签名文件以使数组尺寸正确。这将为python模块'mymod'创建签名文件'sign.pyf:
f2py -m mymod -h sign.pyf test.f90
然后,用它来编译:
f2py -c sign.pyf test.f90
可以在Python中导入和使用库:
>>>import mymod
>>>mymod.test.writevec()
注意,数组边界被移位,第一个元素在Python中的索引为0:
>>>import mymod
>>>mymod.test.vec #output: array([ 1., 2., 3., 4., 5.])
>>>mymod.test.vec[0] #output: 1.0