ccb*_*ney 8 python fortran f2py
我不能让f2py在单独的子例程中引用模块中的参数,在子例程中它用于定义输入数组维度.即参数在一个模块中是失败的:
! File: testmod.f90
MODULE testmod
INTEGER, PARAMETER :: dimsize = 20
END MODULE testmod
Run Code Online (Sandbox Code Playgroud)
并且参数dimsize需要在另一个文件的子例程(不包含在模块中)中引用,该文件将是我的python模块的入口点:
! File testsub.f90
SUBROUTINE testsub(arg)
USE testmod
REAL, INTENT(IN) :: arg(dimsize)
END SUBROUTINE testsub
Run Code Online (Sandbox Code Playgroud)
我像这样编译:
f2py -m testmod -h testmod.pyf testsub.f90
pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o
pgf90 -g -Mbounds -Mchkptr -c -fPIC testsub.f90 -o testsub.o
f2py -c testmod.pyf testmod.o testsub.o
Run Code Online (Sandbox Code Playgroud)
但得到这个错误:
testmodmodule.c: In function 'f2py_rout_testmod_testsub':
testmodmodule.c:180: error: 'dimsize' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
我已经尝试修改testsub.g90以包含以下指令,如其他建议ni:
SUBROUTINE testsub(arg)
USE testmod
!f2py integer, parameter :: dimsize
REAL, INTENT(IN) :: arg(dimsize)
END SUBROUTINE testsub
Run Code Online (Sandbox Code Playgroud)
但无济于事.我需要将子程序与模块分开.
如何让f2py正确解析变量dimsize
?
TIA
虽然我还没有测试过它,但我认为你的原始代码几乎已经完成了。我们对一些代码做了类似的事情,但使用的是 gfortran。
您不需要f2py
testmod.f90 文件。您应该将其编译为目标文件,就像正常的 Fortran 一样:
pgf90 -g -Mbounds -Mchkptr -c -fPIC testmod.f90 -o testmod.o
Run Code Online (Sandbox Code Playgroud)
然后你应该能够将 testsub.f90 编译成 python 可用的模块:
f2py --fcompiler=pgf90 --f90flags="-g -Mbounds -Mchkptr" -c testsub.f90 -m testsub testmod.o
Run Code Online (Sandbox Code Playgroud)
这应该构建一个 testsub.so 或等效的,让你import testsub
然后testsub.testsub(my_arg)
在 python 中。
归档时间: |
|
查看次数: |
1234 次 |
最近记录: |