Python与C++之间的相互调用实例3: 在Python中调用C++的结构体和类

2023-11-09 12:48

本文主要是介绍Python与C++之间的相互调用实例3: 在Python中调用C++的结构体和类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前在C++中写的程序,绝大多数都是用类来封装的。

那么现在想要在Python中进行调用,开始的时候是个头疼的问题。经过将近一天的摸索学习,大概搞明白了一些。

下面贴出来一个例子看一下。

首先是C++的结构体和类:

#pragma once
#include <string>// 这个结构体在Python中定义后可以通用
struct struHeadPose
{float                            angleX;float                            angleY;float                            angleZ;
};// 这个类在Python中定义后可以通用
class pyClass
{
public:int a;int b;int c;char* str;
};// 这是一个功能类
class myClass
{
public:myClass();~myClass();void setPos(struHeadPose tPos);void setPose(float x, float y, float z);struHeadPose getPose();int LoadModel(std::string tStrName);void setPYC(pyClass& tIn);void getPYC(pyClass& tOut);private:struHeadPose m_pos;std::string m_str;pyClass m_pyc;
};

cpp很简单,可以自己实现一下就行了。

然后将上面的内容导出到dll中。具体看上一篇:https://blog.csdn.net/sdust_dx/article/details/80606297

#include "FileCpp.h"
#include "PySEGY.h"
#define DLLEXPORT __declspec(dllexport)
#define C_DLL_EXPORT extern "C" __declspec(dllexport)
extern "C"
{DLLEXPORT void __stdcall setPos1(struHeadPose tPos);DLLEXPORT void __stdcall setPos2(float x, float y, float z);DLLEXPORT void __stdcall getPos(struHeadPose& tPos);DLLEXPORT int __stdcall loadModel(char* tStrName);DLLEXPORT void __stdcall setPYC(pyClass tIn);DLLEXPORT void __stdcall getPYC(pyClass& tOut);
}

然后在python中调用即可。下面是在python中封装了对应的类(结构体),即可进行调用。

有几个注意问题我写在注释中了。

import ctypes
import sys
sys.path.append('./')myDll = ctypes.CDLL('./HelloCpp2.dll')
myDll.Hello()
myDll.display()
myDll.display_int(1)myDll.setPara(1,2)
print('sum=',myDll.getSum())class structPos(ctypes.Structure): #ctypes 的格式定义结构体_fields_ = [("X", ctypes.c_float),("Y", ctypes.c_float),("Z", ctypes.c_float)]sModelPath = ctypes.c_char_p(b"MyString[Can only contain ASCII literal characters.]") # 使用 ctypes.c_char_p 可以传递字符串到C++中
ret = myDll.loadModel(sModelPath)
print("load model = ", ret)
tPos0 = structPos(1.0, 2.0, 3.0)
print('tPos0=', str(tPos0))
myDll.setPos1(ctypes.byref(tPos0))  #ctypes 的格式来调用tPos0结构体(类)
tPos1 = structPos(0,0,0)
myDll.getPos(ctypes.byref(tPos1))
print(tPos1)print ('tPos1.X = ', tPos1.X)
print ('tPos1.Y = ', tPos1.Y)
print ('tPos1.Z = ', tPos1.Z)print ('tPos0.X = ', tPos0.X)
print ('tPos0.Y = ', tPos0.Y)
print ('tPos0.Z = ', tPos0.Z)print('TEST --- CLASS')class testClass(ctypes.Structure): #ctypes 的格式定义结构体_fields_ = [("X", ctypes.c_float),("Y", ctypes.c_float),("Z", ctypes.c_float), ("str", ctypes.c_char_p)]tClass1 = testClass(4,5,6,sModelPath)
myDll.setPYC(ctypes.byref(tClass1))tClass2 = testClass()
myDll.getPYC(ctypes.byref(tClass2))
print ('tClass2.X = ', tClass2.X)
print ('tClass2.Y = ', tClass2.Y)
print ('tClass2.Z = ', tClass2.Z)
print(tClass2.str)


这篇关于Python与C++之间的相互调用实例3: 在Python中调用C++的结构体和类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376176

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图