Python ctypes 指向结构的指针作为标识符,无需成员访问

2023-12-02

我有两个不同的 C 函数,我想将它们与 Python 中的 ctypes 一起使用。

一个函数正在建立连接并返回指向结构的指针。该指针应用作第二个函数中的参数以重用已建立的连接。

C Code:

customStruct * connect()
{
    customStruct *obj = connection_helper();
    return obj;
}

void foo(customStruct * obj)
{
    foo_helper(obj);
}

Python代码:

from ctypes import *
lib = CDLL("./test.dll")

obj = lib.connect()
lib.foo(obj)

不幸的是,当我调用时,我检索到访问冲突错误lib.foo()。我可以重新创建customStructPython 中的结构体使用类_fields_属性,但由于该结构由许多其他结构组成,并且由于我不想访问 Python 本身中的结构成员,因此我正在考虑如何创建可重用的标识符的替代方法。

我可以改变的定义connect()foo()如我所愿。我还可以创建另一个“标识符”结构,如果这样我就不必在 python 中重新创建该结构。

Update:看来我必须使用该功能byref()来实现我想要的。https://docs.python.org/3/library/ctypes.html#ctypes.byref

文档指出“返回的对象只能用作外部函数调用参数”,但我不确定要返回什么connect() then.


如果你有一个不透明的结构(你不知道它的成员,或者不想知道它的成员),你仍然应该创建一个类来在 python 中表示该结构。然后,您可以使用此类来正确键入您的函数。这将有助于防止您意外地将错误的对象作为“CustomStruct”指针传递的错误。

例如:

from ctypes import cdll, c_int, c_void_p

mylib = cdll.LoadLibrary('mylib')

class CustomStructP(c_void_p):
    # subclassing c_void_p creates an opaque pointer type that is distinct
    # from c_void_p, and can only be instantiated as a pointer
    pass

create = mylib.create
create.argtypes = [c_int]
create.restype = CustomStructP

display = mylib.display
display.argtypes = [CustomStructP]
display.restype = None

delete = mylib.delete
delete.argtypes = [CustomStructP]
delete.restype = None

obj = create(10)
display(obj)
delete(obj)

display(CustomStructP())  # passing a null pointer

现在,如果你尝试过类似的事情:display(c_void_p()),你会得到:

Traceback (most recent call last):
  File "C:\Users\User\Documents\python\src\main.py", line 31, in <module>
    display(c_void_p())
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

我使用的C代码是:

#include <stdio.h>
#include <stdlib.h>

struct customStruct {
    int val;
};

struct customStruct *
create(int val) {
    struct customStruct *obj = malloc(sizeof(struct customStruct));
    obj->val = val;
    return obj;
}

void
display(struct customStruct *obj) {
    if (obj) {
        printf("customStruct(%d) @ %p\n", obj->val, obj);
    }
    else {
        puts("customStruct is NULL");
    }
}

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

Python ctypes 指向结构的指针作为标识符,无需成员访问 的相关文章

  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 获取多个同名请求参数

    我的问题是给定的代码 from flask import Flask request app Flask name app route def hello return str request values get param None a
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • tf.print() vs Python print vs tensor.eval()

    看来在Tensorflow中 至少有三种方法可以打印出张量的值 我一直在读here https www freecodecamp org news debugging tensorflow a starter e6668ce72617 an
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 超过两个点的Python相对导入

    是否可以使用路径中包含两个以上点的模块引用 就像这个例子一样 Project structure sound init py codecs init py echo init py nix init py way1 py way2 py w

随机推荐

  • 使用 PHP 查找 JPEG 分辨率

    呼叫所有 PHP 专家 据我所知 您可以使用 getimagesize 来获取 PHP 中图像的实际像素高度和宽度 但是 如果您在 Photoshop 中打开图像并查看图像尺寸对话框 您会注意到有一个分辨率值决定图像的打印尺寸 给定一个任意
  • WSO2 API 管理器 - 在 UI 中显示正确的 IP

    已在一台计算机上安装了 API 管理器 1 4 0 并让一切运行起来 然而 我们发现管理控制台和商店站点中显示的 IP 地址不正确 例如 在 mgnt 控制台主页中的 主机 和 服务器 URL 也在商店中的 api 页面上 概述中提供了 U
  • 改进 AngularJS Simple Factory - PhoneGap 存储 API 的包装器

    我正在尝试用我一般的 JS 技能在 AngularJS 中做一些 好 的事情 我想听听您的感受或改进 重构以下内容 angular module App factory SQLService function q var db window
  • FORTRAN 指针包含多个数组

    我正在开发一个项目 其中在第一 第二和第三维度上有许多相同大小的数组 尽管第四维度的大小可能有所不同 我想通过构造一个连接这些数组的指针来对这些数组进行分组 为了让这个不那么抽象 假设我有 2 个数组 A size N1 x N2 x N3
  • jQuery 复选框事件处理

    我有以下内容
  • 如何更改 WPF 中的视图?

    有一些空闲时间 想尝试用 WPF 制作游戏 我想知道 改变窗口视图的最佳方法是什么 我制作了一个 主菜单 窗口 带有三个按钮 新游戏 继续游戏和退出游戏 当按 新游戏 时 我希望窗口转到下一个 视图状态 以创建玩家等 不希望弹出新窗口 实现
  • 如何强制java服务器仅接受tls 1.2并拒绝tls 1.0和tls 1.1连接

    我有一个在 Java 7 上运行的 HTTPS Web 服务 我需要进行更改 以便该服务仅接受 TLS1 2 连接并拒绝 SSL3 TLS1 0 和 TLS1 1 我添加了以下 Java 参数 以便 TLS1 2 具有最高优先级 Dhttp
  • Spring Boot 无法在端口 80 上启动

    Spring Boot 在默认的 8080 端口上正常启动 每当我尝试在 application properties 中将端口设置为 80 或使用命令行参数时 都会收到以下错误 将端口设置为 9000 效果很好 有任何想法吗
  • Android 5.0 (API 21) 无法渲染自定义字体/字体

    Android 5 0 似乎无法渲染自定义字体 此问题不会出现在 Android 5 0 之前 也不会出现在 Android 5 1 API 22 中 以下是使用名为 coaster 的字体的示例 可在此处获取 http www dafon
  • 嵌入 Google 电子表格中范围和工作表的超链接

    我需要向 Google 表格中制作的报告添加一些导航 它有很多工作表 我添加了一些超链接 以便用户可以单击它们并快速移动到相关工作表或范围 它在编辑器中工作正常 如果我在仅查看模式下共享 但我需要将其发布并嵌入到网页中 当我将其嵌入 Ifr
  • 为什么我在按下“AltGr”时收到两条消息?

    Why do I get two messages on AltGr being pressed 我有以下钩子 LRESULT CALLBACK MyClass KeyboardShotcutsHook int code WPARAM wP
  • 查询字符串参数长度问题。 HTTP 错误 400

    谁能告诉我我的网址问题 http www advantarealty net Search 公寓 单户住宅 Townhome PropertyType True ForMap 8 Zoom 81 3043212890625T29 09937
  • CSS - 弯曲路径中的动画对象

    我只想通过弯曲的路径为我的图像制作动画 像这样 我使用绝对位置进行定位 做了一些研究 发现 css 转换可以完成这项工作 可以通过直线轻松完成 但弯曲的路径 我尝试与 csstransform origin transform rotate
  • Glassfish 上的单线程 MDB

    我有许多 MDB 在 Glassfish 3 1 2 2 上运行 由于其中一个 MDB 的工作性质 我需要将其设为单线程 我看了看调音指南 虽然将最大池大小设置为 1 确实解决了问题 但这也意味着所有其他 MDB 都是单线程的 我真正想要实
  • 您是否必须使用比较函数对数字数组进行排序?

    我的印象是 为了对数字数组进行排序 您必须执行以下操作 var numbers 4 1 2 3 function compare a b return a b numbers sort compare 但是 我发现以下方法似乎有效 var
  • ggplot2position='dodge' 生成的条形太宽

    我有兴趣生成一个位置为 dodge 且填充为某个因素的直方图 即每个条形 组内不同子组的并排条形 但是 ggplot2 给了我类似的东西第一个情节在这里 它的最右边的栏太宽 没有为空组保留空间 这是我想要的 这是一个简单的案例 df dat
  • 负边距和背景

    在下面的标记中 我只想设置负边距 textdiv 使其出现在顶部 image div div class wrap div class image img src imgage jpg div div class text text wit
  • 如何传递指向构造函数的函数指针?

    我正在致力于在 C 中实现反射机制 我的代码中的所有对象都是 Object 我自己的通用类型 的子类 其中包含 Class 类型的静态成员数据 class Class public Class const std string n Obje
  • Bootstrap 日期选择器禁用没有当前日期的过去日期

    我想禁用当前日期之前的所有过去日期 而不是当前日期 我正在尝试通过引导日期选择器库 引导日期选择器 并使用以下代码 date datepicker startDate new Date 效果很好 但直到今天它才被禁用 例如 如果今天是 20
  • Python ctypes 指向结构的指针作为标识符,无需成员访问

    我有两个不同的 C 函数 我想将它们与 Python 中的 ctypes 一起使用 一个函数正在建立连接并返回指向结构的指针 该指针应用作第二个函数中的参数以重用已建立的连接 C Code customStruct connect cust