【问题标题】:Call fortran function from Python with ctypes使用 ctypes 从 Python 调用 fortran 函数
【发布时间】:2012-03-26 03:55:21
【问题描述】:

我希望使用 ctypes 来调用几年前我的老板编写的一些旧的 fortran 库。我按照this previous question中给出的例子,得到了预期的结果。

但是,当我修改代码时,要稍微接近我所面临的情况,这样

integer function addtwo(a, b)
  integer, intent(in) :: a, b
  addtwo = a + b
end function

变成

real function addtwo(a, b)
  integer, intent(in) :: a, b
  addtwo = a + b
end function

即,函数现在是real,而不是integer,返回的值始终是0。谁能解释发生了什么以及我应该如何解决这个问题?

(PS. 我在 mac os snow leopard 上使用的是 64 位 gfortran 编译器)

编辑:我正在努力的功能看起来像:

real function ykr(seed)

  integer, intent(in) :: seed
  real ykr0
  ykr= real(seed)
end function

真的,ykr 递归地调用另一个函数ykr0,但由于即使在这个基本方面我也在苦苦挣扎,所以我暂时忽略它。我看不出这段代码和上面的代码有什么不同,但是调用ykr_(byref(c_int(4)))返回0,而不是预期的4......

【问题讨论】:

  • 你为什么不使用 NumPy 自带的 Fortran FFI 东西?
  • 你是说f2py?它给我的系统带来了很多麻烦,我认为这将是一个很好的短期解决方案。理论上!
  • 你可以试试addtwo = real(a+b),它解决了吗?
  • 确实如此,但已在主代码中实现(请参阅编辑),但我仍然没有得到预期的结果。不过,我看不出这两个函数之间有什么区别。

标签: python fortran ctypes


【解决方案1】:

添加行

ykr_.restype = c_float

在您的 Python 代码中,在 ykr_(byref(c_int(4))) 之前。 这会将函数的返回类型设置为 float(或 Fortan 语言中的 real)。

在原始帖子中,这不是必需的,因为 int 被假定为默认值。

【讨论】:

  • 优秀。非常感谢,这解决了问题。
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2016-03-25
  • 2016-02-02
  • 1970-01-01
  • 2013-03-30
相关资源
最近更新 更多