C++调用Python的工具类

C++调用python 本文以实例code讲解 C++ 调用 python 的方法。 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command: 由 C++ 执行 shell code 3. exe_py: C++调用python文件Code:include/util.h:/**************** 阅读详情

最近参考了别人的C++调用python方法,我把它封装成了一个pyinit的工具类。这样可以使我们在主函数中,只需很少的几步就可以完成python的调用。


pyinit.h

#ifndef _PYINIT_H
#define _PYINIT_H

#include <Python.h>

typedef PyObject py_object;    //这个替换是我的个人习惯,我很少用大写的

class pyinit {
public:
	pyinit();
	~pyinit();
public:
	//执行一段python代码,就好像__main__函数中执行一样,默认是导入sys,和路径
	void pyrun_simple_string(const char* s1 = "import sys",
                             const char* s2 = "sys.path.append('./')");  //执行一段python代码,就好像__main__函数中执行一样,默认是导入sys,和路径
	void load_py_script(const char* name); //加载python脚本,获得name,module,dict   
	void find_function(const char* f);    //查找要执行的函数
	void set_item(const char* type);    //设置参数
	void call_function();            //调用函数
private:
	pyinit(const pyinit& other);
	pyinit& operator=(const pyinit& other);
private:
	py_object* name_;      //文件名
	py_object* module_;    //模块
	py_object* dict_;      //想到与Python模块对象的_dict_属性,得到模块名称空间下的字典对象	
	py_object* func_;      //要执行的函数
	py_object* args_;      //参数
};



pyinit.cpp

#include "pyinit.h"

pyinit::pyinit()
	: name_(NULL), 
	  module_(NULL), 
	  dict_(NULL),
	  func_(NULL),
	  args_(NULL)     //由于都是指针,所以初值全部赋空
{
	Py_Initialize();         //初始化,无返回值
	assert(Py_IsInitialized());   //靠着这来判断是否初始化成功
}

pyinit::~pyinit()
{
	Py_DECREF(name_);    //减少引用计数
	Py_DECREF(args_);
	Py_DECREF(module_);
	Py_Finalize();        //销毁
	name_ = NULL;
	module_ = NULL;
	dict_ = NULL;
	func_ = NULL;
	args_ = NULL;
}

void pyinit::pyrun_simple_string(const char* s1, const char* s2)  //执行s1,s2,如improt sys
{
	PyRun_SimpleString(s1);
	PyRun_SimpleString(s2);
}

void pyinit::load_py_script(const char* name)   //执行脚本,得到名字,模块,字典属性
{
	assert(name != NULL);
	name_ = PyString_FromString(name);
	module_ = PyImport_Import(name_);
	assert(module_ != NULL);
	dict_ = PyModule_GetDict(module_);
	assert(dict_ != NULL);
}

void pyinit::find_function(const char* f)      //查找函数,f是函数名
{
	assert(f != NULL);
	func_ = PyDict_GetItemString(dict_, f);  
	assert(func_ != NULL);
	assert(PyCallable_Check(func_));   //检查函数是否可调
}

void pyinit::set_item(const char* name)  //设置参数
{
	assert(name != NULL);
	args_ = PyTuple_New(1);    //一个参数就new一个元组
	PyTuple_SetItem(args_, 0, Py_BuildValue("s", name));   //args_是一个元组参数,
}

void pyinit::call_function()   //调用函数
{
	PyObject_CallObject(func_, args_);
}



测试文件:

测试文件使用用来解析xml的,形式已经给出。

#include "pyinit.h"
#include <iostream>

int main()
{
	pyinit  py;
	py.pyrun_simple_string();
	py.load_py_script("resolver");
	py.find_function("Parse_XML");
    py.set_item("movies.xml");
	py.call_function();
	return 0;
}



Visual Studio 2022 C++ 调用matplotlib-cpp 绘图 利用matplotlib-cpp在Visual Studio 2022中绘图 阅读详情

相关推荐

C++调用python指南

C++调用python指南,记录一下踩过的坑,应该会对别的小伙伴有帮助~

橙的博客 2125

Python和C/C++互相调用

// PythonInvoke.h #pragma once #include <string> #include "../include/python/Python.h" class PythonInvoker { public: // init/uninit static void InitPythonEnv(); static void Uninit(); static PyObject* PyInit(); // invoke python

Wite_Chen 401

Python3.6调用C++函数

1.首先配置VS环境,我这里用的是VS2015,分别选择Release和X64下运行。2.在VS中添加Python的库。3.创建CPP文件,代码如下:#include &lt;Python.h&gt;  #include &lt;iostream&gt;  static PyObject* HelloWorld(PyObject *self, PyObject *args){ std::cout ...

sinat_27717169的博客 6227

C++ || 在C++工程中调用python脚本中的函数、类

深度学习相关的算法,都是使用python语言编写; 应用工程等基本由c++编写;想要将两者很好的结合起来,会缩短开发时间。 实际过程中,会把python的脚本编写成类的形式。然后使用C++对python类进行实例化、实例对象的成员函数调用。 1 环境配置 电脑环境:windows10、vs2015、python3.6 【python3.6】 安装anaconda,使用conda创建虚拟环境,并在虚拟环境中配置好自己需要的资源。 找到安装anaconda路径下,创建的虚拟环境的文件夹,我的电脑在默.

magic_ll的博客 2255

Python错误解决:动态模块未定义模块导出函数(PyInit_example)

总之,当您遇到ImportError: dynamic module does not define module export function (PyInit_example)错误时,请尝试以上解决方案,并确保您的编译环境和ABI版本正确。更具体地说,它表示Python解释器无法找到C/C++编写的动态链接库(.so文件),并且该库中没有一个名为PyInit_example的导出函数。请注意,如果Python解释器和.so文件的ABI不匹配,则必须重新编译.so文件以与解释器匹配。

. 6791

C++调用Python3函数与类的实例代码

Vs2015 - C++调用Python3函数与类的实例代码,具体可查看https://blog.youkuaiyun.com/automoblie0/article/details/102461477

构建 Python C 扩展模块

有好几种扩展 Python 的功能的方法。其中一种就是用 C 或 C++ 编写 Python 模块。通过这个过程可以提高性能,更好地访问 C 库函数和系统调用。在本教程中,我将带大家了解...

muzico425的博客 1829

(实现的工具python工具类)utils.rar

自己学习实现的日志打印,CRC16校验,Bytes转16进制输出的工具小模块,学习留存用。一方便之后开放使用。

使用 C 或 C++ 开发 Python库(01)

如果您知道如何使用 C 编程,那么向 Python 中添加新的内置模块非常容易。此类扩展模块可以完成两件无法在 Python 中直接完成的事情:它们可以实现新的内置对象类型,并且它们可以调用 C 库函数和系统调用。

gongdiwudu的专栏 2520

C++调用python3.5中的函数

下载后需要,按照博客中的过程就可以运行。需要安装anaconda3

XGBoost实战:从原理到调参,手把手教你提升模型性能(附Python代码)

本文深入解析XGBoost核心原理,并提供一套从数据准备、系统性调参到生产部署的完整实战指南。通过剖析目标函数、正则化项与分裂算法,帮助读者理解参数背后的数学逻辑,并利用交叉验证、早停法及自动化工具(如Optuna)高效提升模型性能。文中附有详尽的Python代码示例,涵盖类别特征处理、缺失值应对、不平衡数据调整及模型可视化等高级技巧。

weixin_29178069的博客 460

python3调用cpp的方法——python调用so

python中使用ctypes模块可以在python中直接调用C/C++。 首先要将C/C++编译成动态库(.so),之后python中调用即可 特别注意在调用C++函数需要在函数声明时,加入前缀“ extern “C” ”,这是由于C++支持函数重载功能,在编译时会更改函数名。在函数声明时,前缀extern "C"则确保按C的方式编译。 值得注意的是,一定要有函数输入输出类型的声明,int型不用...

springlustre的专栏 3万+

Zabbix-01简单导入MIB文件并测试

这里写自定义目录标题安装 MIB文件启用MIB文件测试MIB文件 MIB文件 MIB代表管理信息库。 MIB文件允许您使用OID(对象标识符)的文本表示。 ##例如: ifHCOutOctets 是OID【1.3.6.1.2.1.31.1.1.1.10】的文本表示 安装 MIB文件 在基于Debian的系统上: # apt install snmp-mibs-downloader # download-mibs 在基于RedHat的系统上: # yum install net-snmp-libs 启用M

lokibaba的博客 9180

C++调用Python总结

  最近要通过开源数据集测试模型,官方标签有的不适合整理为C++格式进行处理,因此准备通过与Python混合编程实现。网上关于如何实现有很多资料,这里总结下用到的资料和遇到问题。 1、工程配置   python是必须要装好的,这里主要说下vs的配置。   C++调用Python脚本中的函数   参考该博文,C++调用Python主要使用到Python安装路径下的include、libs、该目录下相...

yangjf91的博客 3万+

基于分段线性近似的Softmax硬件加速器设计

本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。

weixin_28278377的博客 313

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

C++调用Python

瞎写,看看就得了,我很难把所有技术都发出来的

家里蹲大学摸鱼学专业优秀毕业生的博客 8318

告别手动配置!用Vector vLinkGen 2.1.0自动生成AUTOSAR链接脚本(附bss段配置详解)

本文详细介绍了如何使用Vector vLinkGen 2.1.0工具自动生成AUTOSAR链接脚本,告别繁琐的手动配置。通过解析vLinkGen的核心架构和bss段配置实践,帮助开发者提升嵌入式软件开发效率,支持多种主流编译器,实现精确的内存分配和初始化策略。

weixin_28716181的博客 380

Python调用C++

python被称为胶水语言,其优势是能够粘结各种不同的语言。同时,python有着更大的“亲民性”,很容易进行开发。但是,python最大的问题就是。通常可以用CUDA或者C++对一个python程序进行加速,加速策略如下:大规模算术运算、矩阵运算等过程用底层语言编写,python只负责传参和处理结果数据;十分常用的函数,我们可以用C++写成“算子”,然后python调用算子即可,如边缘检测的Sobel算子;

呆呆象呆呆的博客 1万+

49、Linux内核内存管理:MGLRU、DAMON与OOM杀手详解

本文详细解析了Linux内核内存管理中的三大核心机制:MGLRU(多代LRU)页面追踪与回收机制、DAMON数据访问监控工具及其在内存优化中的应用,以及OOM(内存不足)杀手的工作原理和触发方式。同时,文章还介绍了VM overcommit_memory策略的设置及其对内存分配的影响,帮助开发者和系统管理员更好地理解Linux内存管理机制,从而优化系统性能和稳定性。

dropout6artist的博客 111

防护装备穿戴检查:基于YOLOv8与UI界面的深度学习应用

通过结合YOLOv8模型与UI界面,本系统实现了防护装备穿戴检查的自动化。该系统能够快速识别工作人员是否正确佩戴了所需的防护装备,帮助提高安全管理水平。未来,随着技术的发展,防护装备穿戴检查系统将在更多领域得到应用,如工业现场、建筑工地等,实现更加精确和高效的实时监控。

YOLO 355

C++调用Python的方法

0 背景 在《Python调用C++程序的几种方法》中,我们介绍了 python 调用 c++ 的一些方法,实际项目中,有时会遇到 c++ 调用 python 的需求,比如实现代码加密等功能,因此本文对相关方法做一个整理记录。 1 https://cyendra.github.io/2018/07/10/pythoncpp/ https://cloud.tencent.com/developer/article/1174629 https://docs.python.org/3.8/extend.

ZONGXP的博客 3万+

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4213

C++调用python的方法

实例:UE4中C++调用python模块实现Switchboard进程 Windows环境下 UE通过调用bat脚本来开启子进程,bat脚本中会调用python.exe执行python脚本。 调用顺序为:C++ >> bat脚本 >> python.exe >> py文件 1. 编写python模块程序 包含以下文件目录: switchboard文件夹包含所有要执行的python脚本 venv文件夹包含执行python需要的环境文件、解释器等 2. 编写调用pyth

krabbit1997的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python调用cpp_Python调用C/C++的种种方法

Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过.1. Python 调用 C (base)想在python中调用c函数, 如这儿的fact#includeint fact(int n){if (n <= 1)return 1;elsereturn ...

weixin_39980347的博客 1550

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在 python 中调用 C/C++

Python 是一种很好用的胶水语言,利用Python的简洁和C++的高效,基本可以解决99%的问题了,剩下那 1% 的问题也就不是问题了,毕竟不是所有问题都可解。这里讨论前者,在 python 中调用 C/C++ 代码的方法很多,这里记录三种方法的使用。

哦豁灬 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: Mysql快速复习(二)正则表达式
下一篇: Mysql快速复习(三)--计算字段、处理函数、汇总数据
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值