我使用python的ctypes调用so库,然后其他普通的指针就可以调用,但是这种类似于python字典请问应该怎么调用,最好贴个代码
关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率

已结题
ctypes 调用 c++ 参数是 std::map
收起
- 写回答
- 好问题 0 提建议
- 关注问题
微信扫一扫
点击复制链接分享
- 邀请回答
- 编辑 收藏 删除
- 收藏 举报
2条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
这一次有糖 2023-05-26 17:27关注你得先将std::map转换为普通的指针,在传递给so库
#include <map> #include <stdint.h> extern "C" { void* map2ptr(std::map<int32_t, int32_t>* map) { return static_cast<void*>(map); } }
在py加载执行
import ctypes from ctypes import * lib = cdll.LoadLibrary("./libtest.so") class IntMap(Structure): _fields_ = [("key", c_int32), ("value", c_int32)] lib.map2ptr.restype = c_void_p lib.map2ptr.argtypes = [POINTER(c_void_p)] py_dict = {1: 10, 2: 20, 3: 30} cpp_map = [IntMap(k, v) for k, v in py_dict.items()] map_ptr = lib.map2ptr(cpp_map)
本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 1无用举报 编辑记录微信扫一扫
点击复制链接分享
编辑预览轻敲空格完成输入- 显示为
- 卡片
- 标题
- 链接
评论按下Enter换行,Ctrl+Enter发表内容
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
关注
- 这篇博客: 使用C++编写Python扩展中的 4. 总结,涉及 ctypes 使用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
这里并不是想黑 ctypes,只是在最初使用的方案中,利用 ctypes 加载 C/C++ 程序编译的动态库文件,之后调用函数,并返回值,整个过程似乎是没有问题,但应该只是看起来没有问题而已。单个测试程序运行正常,Python 中能够调用函数,得到想要的效果。但是将其应用到 Python 多线程程序中,就会出现错误。查看 core 文件,最终出错地点是 Python 类中调用 C/C++ 函数相关实例回收的函数,出现了段错误,导致程序宕掉。
当时段时间内没有得到问题所在原因,就改为使用写 Python 扩展的形式。在学习和使用扩展的过程中,也逐渐意识到问题可能是什么原因导致的。
Python 程序和 C/C++ 程序在运行时,对于所需要的空间,各自开辟、各自回收。因此,二者在空间利用上最好不要有交集。使用 Python 扩展的形式这一点就很明确:扩展会通过 PyArg_ParseTuple 函数将 Python 中传递过来的参数解析,用 C/C++ 中的变量或者缓冲区接收,相当于对原数据进行一次拷贝,而不是直接在原数据上操作。在向 Python 返回数据时,不是直接返回 C/C++ 程序的结果,而是根据 C/C++ 程序中的结果构建 Python 数据(或者说是对象)。这样既完成了两种程序之间的数据通信,两种程序又不会互相干扰。
本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏举报微信扫一扫
点击复制链接分享
编辑预览轻敲空格完成输入- 显示为
- 卡片
- 标题
- 链接
评论按下Enter换行,Ctrl+Enter发表内容
编辑
预览

轻敲空格完成输入
- 显示为
- 卡片
- 标题
- 链接
报告相同问题?
提交
- 2021-03-31 00:33AI松子666的博客 (注意:windows系统下要用MSVC编译成动态库dll,用qt中的MinGW编译出来的动态库调用报错,具体原因不明。如果使用MSVC编译器,就需要调用的第三方opencv库也是MSVC编译的才行。博主测试过,在网上下载的window系统...
- 2023-05-31 13:11星光2020的博客 在Python中可以通过几种方法调用C++的函数,这里介绍使用ctypes的方法。ctypes是Python自带的一个模块,能够直接载入C++生成的动态链接库,并调用其中的函数。这是比较简单的例子,对于使用numpy等数据类型的函数则...
- 2022-01-25 21:56hankern的博客 std::string::size_type pos = 0; pos=str.find_first_of("$'\"", pos) pos = str.find_first_not_of("ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_", pos)
- 2016-01-07 03:23迈克暖风的博客 使用python3从数据库读出数据,然后根据其中的几个字段相同的归类合并一行,然后输出到EXCEL中,数据大概是5W行,考虑到归类合并逻辑比较复杂,用python效率比较低,这部分用c/c++完成,python3调用生成的dll....
- 2021-12-14 13:19找不到服务器zhn的博客 C++和python的代码如何相互调用? 浅谈python中使用C/C++:ctypes https://docs.python.org/3.11/library/ctypes.html Linux下我试了没问题的 python3调用cpp的方法——python调用so visual studio 新建动态链接库...
- 2020-12-10 23:03weixin_39603117的博客 ("byte_test_p",ctypes.POINTER(ctypes.c_byte)) ] CALLFUNC = ctypes.CFUNCTYPE(ctypes.c_void_p,ctypes.c_long,ctypes.POINTER(NET_DVR_ALARMER),ctypes.c_void_p,ctypes.c_char_p)#这个是回调函数的参数 ...
- 2024-08-30 06:39Markzero(Unique)的博客 Python在使用ctypes调用C、C++动态库的场景
- 2022-07-02 12:04Python提供了一种灵活的方式,通过接口库如`ctypes`、`SWIG`或`pybind11`来调用C++代码。本篇主要介绍如何使用`pybind11`这一现代、简洁且高效的工具来实现Python调用C++类的方法。 `pybind11`是一个强大的库,它的...
- 2021-12-03 09:46RNG_uzi_的博客 前言:本文可结合Python调用C语言(DLL)使用,效果更佳。 采用导出形式:_declspec(dllimport) 创建DLL项目 运行Python将参数进行传递给DLL,然后从DLL返回指针(包含多个变量) 打开VisualStudio 创建DLL 点击...
- 2022-05-01 08:36深一的博客 python3调用C++
- 2020-11-05 16:01weixin_39975868的博客 在之前的文章中提到了混合编程这个做法,也提到了c++中怎样去调用python脚本,然而,python毕竟是脚本,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成。那怎样做呢?众所周知,python的...
- 2021-11-05 22:24wujianming_110117的博客 TVM中Python/C++接口调用关系 TVM已经是一个很庞大的系统,包含了很多的功能模块,python和c++的互相调用这个功能模块,没有使用第三方的开源库(boost.python、pybind11等),自主实现了一套复杂但精致高效强大的...
- 2019-11-15 03:25liuyuan185442111的博客 c++11里 std::pair<T1,T2>::pair 的构造函数有: constexpr pair(); pair(const T1& x, const T2& y); template <class U1, class U2> pair(U1&& x, U2&& y); template <...
- 2021-09-06 11:18风火编程的博客 python调用c++ c++文件中声明以c的方式编译 extern "C"{ Test* test_new(){return new Test;} double my_calculate(Test* t, int a, double b, char c[], int * d, double * e, char ** f){ return t->...
- 2024-06-26 02:27Tech Embedded的博客 它简化了C++ 函数、类和数据结构在Python中使用的过程,使得开发人员可以方便地在Python中调用C++ 代码,同时保留两者的性能优势下面将详细介绍Pybind11的基本概念、安装方法、用法以及示例代码。Pybind11允许C++...
- 2023-04-12 02:39Kun Li的博客 win10 c++通过libtorch调用yolov5模型 配置及使用_torch_cuda.dll_qq_38617319的博客-CSDN博客环境:windows 10;vs2017;libtorch1.8.1-cuda10.2opencv3.4.14cmake 3.20.2libtorch下载(Release版):gpu版:...
- 2018-06-07 09:41菲斯奇的博客 那么现在想要在Python中进行调用,开始的时候是个头疼的问题。经过将近一天的摸索学习,大概搞明白了一些。下面贴出来一个例子看一下。首先是C++的结构体和类:#pragma once #include <string> // 这...
- 2024-02-08 14:52峰上踏雪的博客 在 CentOS 7 中,使用 pybind11 构建 C++ 的动态库供 Python 调用涉及几个步骤:安装依赖、获取 pybind11、编写绑定代码、编译动态库,以及在 Python 中调用。
- 2021-08-09 01:49京华道衍的博客 咱们要有点娱乐精神,关于 C++的笑话数都数不清:笑话:C++是一门不吉祥的语言,据说波音公司之前用ADA为飞机硬件编程,一直用的好好的,后来招聘了一伙大学生,学生们说我靠还在用这么落后的语言,然后换成C++重构...
- 没有解决我的问题, 去提问
联系我们(工作时间:8:30-22:00)
400-660-0108kefu@csdn.net在线客服
- 京ICP备19004658号
- 经营性网站备案信息
公安备案号11010502030143
- 营业执照
- 北京互联网违法和不良信息举报中心
- 家长监护
- 中国互联网举报中心
- 网络110报警服务
- Chrome商店下载
- 账号管理规范
- 版权与免责声明
- 版权申诉
- 出版物许可证
- ©1999-2025北京创新乐知网络技术有限公司