首页 > 后端开发 > Python教程 > 为什么使用 ctypes 从 Python 调用我的 C 函数时返回不正确的值?

为什么使用 ctypes 从 Python 调用我的 C 函数时返回不正确的值?

Mary-Kate Olsen
发布: 2024-12-24 20:50:14
原创
587 人浏览过

Why Does My C Function Return an Incorrect Value When Called from Python Using ctypes?

通过 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板