Python ctypes的输入和输出参数
我在使用python中的ctypes来访问dll中的fortran函数时遇到了格式化输入和输出参数的问题。我可以访问库和函数,但在如何设置参数格式方面遇到了困难 f90代码以以下形式开始:Python ctypes的输入和输出参数,python,fortran,ctypes,Python,Fortran,Ctypes,我在使用python中的ctypes来访问dll中的fortran函数时遇到了格式化输入和输出参数的问题。我可以访问库和函数,但在如何设置参数格式方面遇到了困难 f90代码以以下形式开始: subroutine DataSub (Data_input,da,db,dy) double precision, intent(in) :: Data_input(9) double precision, intent(out) :: da,db,dy 如何在ctypes中定义这种情况
subroutine DataSub (Data_input,da,db,dy)
double precision, intent(in) :: Data_input(9)
double precision, intent(out) :: da,db,dy
如何在ctypes中定义这种情况下的输入和输出参数?这些参数很可能是c_-double,但是您不应该再使用“双精度”。 将real与kind属性一起使用,更好的做法是使用Fortran中的ISO_C_绑定来提供类似C的接口。 ISO_C_绑定还允许您通过值而不是引用传递参数。 如果没有它,您将需要使用
John Reid提供了一些ISO_C_绑定示例:这些示例很可能是C_double,但是您不应该再使用“双精度”。 将real与kind属性一起使用,更好的做法是使用Fortran中的ISO_C_绑定来提供类似C的接口。 ISO_C_绑定还允许您通过值而不是引用传递参数。 如果没有它,您将需要使用 John Reid提供了一些ISO_C_绑定示例:类似于以下内容:
from ctypes import *#just for brevity in this example
input = (c_double*9)()
input[0] = .....
da = c_double()
db = c_double()
dy = c_double()
dll.DataSub(byref(input), byref(da), byref(db), byref(dy))
大概是这样的:
from ctypes import *#just for brevity in this example
input = (c_double*9)()
input[0] = .....
da = c_double()
db = c_double()
dy = c_double()
dll.DataSub(byref(input), byref(da), byref(db), byref(dy))
ctypes可以通过引用传递,而且确实需要为out参数传递。实际上,我认为没有ISO_C_绑定,所有参数都必须是byref,而不管它们的意图如何。如果不使用绑定,您还需要注意编译器附加到符号上的“389;”。因此,在我看来,在Fortran端引入一些接口定义是个好主意。更紧密地模仿C行为应该允许更好的可移植性,减少Python端的惊奇。CType可以通过引用传递,并且确实需要为out参数这样做。实际上,我认为没有ISO_C_绑定,所有参数都必须是byref,而不管它们的意图如何。如果不使用绑定,您还需要注意编译器附加到符号上的“389;”。因此,在我看来,在Fortran端引入一些接口定义是个好主意。更紧密地模仿C的行为应该可以在Python端实现更好的可移植性和更少的惊奇?比如,如果da(FORTRAN)是长度2,那么python中的调用会是“da=(c_double*2)(”?是的,克里斯,这是正确的。阅读ctypes教程,非常好。是的,谢谢。我一直在读它,但它在某些方面是模糊的或令人困惑的。谢谢你的回复!如果其中一个输出是一个数组,它会相似吗?比如,如果da(FORTRAN)是长度2,那么python中的调用会是“da=(c_double*2)(”?是的,克里斯,这是正确的。阅读ctypes教程,非常好。是的,谢谢。我一直在读它,但它在某些方面是模糊的或令人困惑的。谢谢你的回复!