通过 Ctypes 从 Python 调用时,C 函数返回不正确的值
在尝试利用 Ctypes 从 Python 调用 C 函数时,出现不匹配就出现了预期的结果。该函数将给定数字提升为指定的幂,在 C 中直接调用时返回预期的结果。但是,在 Python 中调用它时,获得了不同的、不正确的值。
共享文件容纳 C 函数是使用以下命令生成的:
$ gcc -fPIC -shared -o test.so test.c
在对 C 函数配置进行一些排列之后,在某些情况下确实返回了预期值,表明问题确实存在并非源自 C 代码中的固有缺陷。值得注意的是,当函数被简化为计算一个简单的平方(即返回 x*x 而不是使用 for 循环)时,Python 返回了正确的结果。
最终目标是访问二维 C Python 中的数组。
#include <stdio.h> float power(float x, int exponent) { float val = x; for(int i=1; i<exponent; i++){ val = val*x; } return val; }
from ctypes import * so_file = '/Users/.../test.so' functions = CDLL(so_file) functions.power.argtype = [c_float, c_int] functions.power.restype = c_float print(functions.power(5,3))
从 C 调用该函数时,观察到预期输出 125.0。然而,Python 却生成了 0.0 的值。
经过进一步调查,发现差异是由于在 Python 中指定 C 函数的参数类型时出现错误而导致的。无意中使用了错误拼写的 argtype,而不是 argtype。
functions.power.argtypes = [c_float, c_int]
纠正此拼写错误后,从 Python 调用该函数时成功返回正确的值 (125.0)。
以上是为什么使用 ctypes 从 Python 调用我的 C 函数时返回不正确的值?的详细内容。更多信息请关注PHP中文网其他相关文章!