在Python中调用C函数并返回2个值

2023-12-07

我试图弄清楚如何从我在 python 中调用的 C 函数返回 2 个值。我已阅读在线材料并使用 struct 输出这两个变量。当我在同一个 C 文件中调用此函数时,我能够输出变量。然而,当我尝试在 python 中调用它时,它仍然只返回一个值。

这是我的 C 代码:

struct re_val {

    double predict_label;
    double prob_estimates;  

};

struct re_val c_func(const char* dir, double a, double b, double c, double d )
{
    double x[] = {a,b,c,d};

    printf ("x[0].index: %d \n", 1);
    printf ("x[0].value: %f \n", x[0]);

    printf ("x[1].index: %d \n", 2);
    printf ("x[1].value: %f \n", x[1]);

    printf ("x[2].index: %d \n", 3);
    printf ("x[2].value: %f \n", x[2]);

    printf ("x[3].index: %d \n", 4);
    printf ("x[3].value: %f \n", x[3]);

    printf ("\nThis is the Directory: %s \n", dir); 

    struct re_val r;
    r.predict_label = 5.0;
    r.prob_estimates = 8.0;   

    return r;

}

这是我的Python代码:

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double]
calling_function.c_func.restype =  ctypes.c_double
q = calling_function.c_func("hello",1.3256, 2.45, 3.1248, 4.215440)
print q

目前,当我在终端中运行 python 文件时,它会输出以下内容:

x[0].index: 1 
x[0].value: 1.325600 

x[1].index: 2 
x[1].value: 2.450000 

x[2].index: 3 
x[2].value: 3.124800 

x[3].index: 4 
x[3].value: 4.215440 

This is the Directory: hello 

5.0

相反,我希望它输出:

x[0].index: 1 
x[0].value: 1.325600 

x[1].index: 2 
x[1].value: 2.450000 

x[2].index: 3 
x[2].value: 3.124800 

x[3].index: 4 
x[3].value: 4.215440 

This is the Directory: hello 

5.0
8.0

你的C代码很好,你遇到的问题是你如何使用python ctypes。您应该告诉该函数返回一个struct re_val而不是双倍:

calling_function.c_func.restype =  ctypes.c_double

上面的内容使得函数在 ctypes 看来返回一个 double 值。你应该告诉 python 该函数返回一个结构:

import ctypes as ct

# Python representation of the C struct re_val
class ReVal(ct.Structure):
    _fields_ = [("predict_label", ct.c_double),("prob_estimates", ct.c_double)]

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double]
# and instead of c_double use:
calling_function.c_func.restype = ReVal

通过这种方式,您可以告诉 python 的 ctypes 该函数返回一个聚合对象,该对象是 ctypes.Structure 的子类,与struct re_val来自c库。

NOTE使用 argtypes 和 restype 时要非常小心,如果使用不正确,很容易使 python 解释器崩溃。然后你会得到一个段错误而不是一个很好的回溯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中调用C函数并返回2个值 的相关文章

  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • GitHub Actions:每个步骤都必须定义“uses”或“run”键

    我想设置 github 操作 调用 nuget 并缓存它 构建解决方案 运行单元测试 我设法让第二步和第三步正常工作 但现在将第一步结合起来是一个问题 name Cache Nuget uses actions cache v1 with
  • 如何使用 SpaCy 中的管道组件修改 spacy.tokens.doc.Doc 令牌

    我正在使用 SpaCy 预处理一些数据 但是 我对如何修改内容感到困惑spacy tokens doc Doc class 例如 这里 npc spacy load pt def pre process text doc gt str ne
  • NSPredicate 子查询语法

    我有一些不友好的字典数组 这些字典数组又包含数据数组 我试图根据传递谓词的任何内部数组来过滤外部数组 我似乎无法创建 NSPredicate 来完成这项工作 我从以下开始 NSPredicate lookupPredicate NSPred
  • SQL-列中的相似数据

    有什么办法可以在列中找到类似的结果 例子 我希望从没有 4 棵绿树的表数据中查询返回 因为没有与绿树相似的数据 但蓝色汽车与蓝色汽车相似 红色娃娃与红色娃娃相似 这个怎么做 我使用微软sql server管理工作室 你可以使用SOUNDEX
  • 如何在 2x2 网格上绘制多个 seaborn catplot?

    我尝试使用 FacetGrid 绘制 2x2 网格 每个子图都是相同数据的猫图 但只是具有不同的 抖动 值 它没有起作用 这是我现在使用的代码 sns catplot x Sex y SidestepDist jitter False da
  • 如何合并 Flex Datagrid 中的单元格?

    有没有办法在数据网格中合并单元格 垂直和 或水平 例如 至少有一种方法可以显示某些数据网格列属于一组 例如 我将采用三列 column1 column2 column3 所有这三个单元格都应分组到行距为 3 的 类别 单元格中 如果您愿意的
  • 在ggmap中对图例顺序进行排序

    如何对 ggmap 中的图例顺序进行排序 我有以下代码 mymap lt ggmap map geom point data mypoints aes x lon y lat colour month alpha 0 5 size 5 我希
  • 如何在特定坐标处将完整的 JTable 组件导出为 pdf

    在我的项目中 我必须以 pdf 格式打印 JTable 组件以及所有自定义项 如边框 颜色等 对于这个要求 我搜索了一下 找到了一个在 pdf 中打印 JTable 的代码 但打印后我发现表格的第一行和第一列的边框丢失了 而且我没有找到在某
  • Rail 4 中的批量分配受保护属性

    我收到错误消息警告 无法批量分配受保护的属性 有一种方法 强参数可以解决问题 但是失败了 我不想做attr accessible title description在每个模型中 我宁愿使用 Strong 参数 我在代码中使用 group p
  • Python 按标签和属性递归对 XML 元素进行排序

    我是 Python 新手 我正在尝试使用一些规则对 XML 进行排序 我的例子
  • 创建图像对象数组

    我正在尝试创建一系列图像对象 但很困难 每个对象将包含一个图像和图像的标题 当我将以下代码粘贴到 Firebug 中进行检查时 它工作正常 实施例1 var imageArray new Array imageArray 0 new Ima
  • 使用 REGEX 用可变长度零填充数字

    我遇到一种情况 客户端输入一个数字 我需要通过在其前面填充一定数量的零来验证该数字 我验证的字段的最大长度是 9 位数字 因此如果客户端输入 123 我需要在其前面填充 6 个零并进行验证 听起来很容易 对吧 好吧 这是最关键的 我对过程的
  • Codeigniter 连接模型中的两个表

    我想在我的模型中加入 2 个表 但它不起作用 这是我现在的模型 function list get id this gt load gt database query this gt db gt get where lists array
  • 如何使用 GET/POST 和 Token key 基于 Ajax 调用 ASP.NET Web API

    我知道如何将 Ajax 与 GET POST 数据一起使用 如下代码所示 但我不知道如何将其与 Token key 一起使用 已获得 Token key read1 click function support cors true ajax
  • C++ 未声明的标识符错误

    我得到一个未声明的标识符错误 我不知道为什么 我什至重写了完整的内容以确保我没有犯错 有人能告诉我为什么会出现这个错误吗 我的文件是 连接 hpp pragma once include LogicSimulator hpp include
  • 如何使用 thymeleaf 递归渲染菜单

    我想使用 ul li 列表呈现 HTML 菜单 我有这个类结构 public class MenuItem private String name private MenuItem parent private List
  • ASP.NET MVC:出现空 ActionLink

    我使用默认路由 因此不需要指定控制器 routes MapRoute Default action id new controller Home action Index id UrlParameter Optional 有了这个 我可以创
  • 在 C 中传递二维指针数组

    对于我的程序 我需要将一个二维指针数组传递给单独文件中的函数 我在下面编写了一个类似语法的文件 include
  • 使用 py2exe 捆绑时导入错误

    我使用 py2exe 捆绑了一个用 python 编写的小脚本 该脚本使用了许多包 其中之一是reportlab 使用 py2exe 捆绑后 我尝试运行可执行文件 但它返回以下错误 C Python26 dist gt DELchek ex
  • 在Python中调用C函数并返回2个值

    我试图弄清楚如何从我在 python 中调用的 C 函数返回 2 个值 我已阅读在线材料并使用 struct 输出这两个变量 当我在同一个 C 文件中调用此函数时 我能够输出变量 然而 当我尝试在 python 中调用它时 它仍然只返回一个