【问题标题】:Calling a C library module with ctypes gives false results使用 ctypes 调用 C 库模块会给出错误结果
【发布时间】:2014-10-30 18:58:48
【问题描述】:

我创建了一个简单的 C 库文件来测试如何使用 ctypes 访问 C 函数。

C 文件中名为 tetr.c 的函数内容如下:

double square(double x){
    return x*x;
}

所以它返回数字的平方。

我已使用以下代码将其编译为目标文件:

gcc -c tetr.c -o tetr.o

并使用以下方式共享对象文件:

gcc -shared -Wl,-soname,library.so -o tetr.so tetr.o

到目前为止一切顺利。我调用 ipython shell,并将我的库设置为变量 lib:

import ctypes
lib = ctypes.cdll.LoadLibrary("tetr.so")

当然,当我打电话给lib.square(ctypes.c_double(2.0)) 时,它应该给我4.0。相反,我得到1。我在函数 square 中插入的任何数字都会发生同样的情况,甚至是零。

一个简短的通知,我在我的函数中使用了ctypes.c_double,因为没有它,当我输入一个整数时我得到零并且

ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1

当我输入浮点数/双精度时。

有什么想法我可能做错了吗?

【问题讨论】:

  • 是否也需要转换(强制转换)返回值?
  • 我不明白为什么我应该这样做。不过会尝试一下,谢谢你的想法。
  • 你需要告诉ctypes该函数返回一个double。它自己无法弄清楚,所以除非你告诉它,否则它假定每个函数的返回类型都是int。见docs.python.org/2/library/ctypes.html#return-types
  • 谢谢,除了将参数类型设置为double 之外,还可以。
  • 如果您可以重写此评论作为对帖子的回答,我会检查它作为解决方案。

标签: c python-2.7 ctypes


【解决方案1】:

您需要告诉ctypes 该函数返回一个双精度值。它自己无法弄清楚,所以除非你告诉它,否则它假定每个函数的返回类型都是int。见https://docs.python.org/2/library/ctypes.html#return-types

例如:

import ctypes
lib = ctypes.cdll.LoadLibrary("tetr.so")
lib.square.restype = ctypes.c_double
ret = lib.square(ctypes.c_double(2.0))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2021-01-28
    • 1970-01-01
    • 2020-09-21
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多