Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ctypes的输入和输出参数_Python_Fortran_Ctypes - Fatal编程技术网

Python ctypes的输入和输出参数

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中定义这种情况

我在使用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中定义这种情况下的输入和输出参数?

这些参数很可能是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教程,非常好。是的,谢谢。我一直在读它,但它在某些方面是模糊的或令人困惑的。谢谢你的回复!