首页 > 编程语言 >基于pybind11实现C++程序中调用Python脚本增加C++程序扩展性

基于pybind11实现C++程序中调用Python脚本增加C++程序扩展性

时间:2023-11-16 17:23:58浏览次数:42  
标签:调用 Python py 程序 扩展性 python C++ pybind11

 

文章目录

 


前言

  • Windows平台,在实际C++项目开发中,结合pybind11库,让python成为C++的脚本语言,可以大大提高C++程序的可扩展性,大大提高开发效率,特别是针对多变的业务逻辑的优秀构架.

一、pybind11与Python环境配置

  1. pybind11安装
    从GitHub上下载源码:https://github.com/pybind/pybind11
  2. 安装Python3.7
    具体教程:https://blog.csdn.net/qq_40969467/article/details/82763878

二、C++环境配置

  • 下载visual studio2015之后的版本
    配置C++开发环境
    注: pybind11只支持visual studio2015之后的版本

  • 新建C++项目

  • C++项目环境配置
    ---- 项目文件目录结构

    ---- 项目属性配置


三、C++调用Python交互代码

-----通过pybind11,c++可以很方便的调用python中的函数,并互传参数,
-----这里运行时注意pybind11默认会将C++编译的exe运行路径加入到python的工作目录中,默认情况下,python脚本只有放到C++的exe同级目录中,才会被加载到.
----为方便脚本文件的管理,可以用特殊方法处理:将整理py脚本的文件加动态加入到python的工作目录中:

import sys
import pathlib
import os
sys.path.append(os.path.join(pathlib.Path(file).parent.absolute(), ‘PythonScript’))

#include <iostream>
#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
namespace py = pybind11;
using namespace std;

void InitPython()
{
    //用于指定脚本路径
	py::module asd = py::module::import("PythonScriptPathConf");
}

int main()
{
	/*py::scoped_interpreter guard{};
	py::module math = py::module::import("test");
	py::object result = math.attr("Add")("25");
	std::cout << "Sqrt of 25 is: " << result.cast<float>() << std::endl;
    std::cout << "Hello World!\n";*/
	py::scoped_interpreter python;
	py::module sys = py::module::import("sys");
	try
	{
		InitPython();
		py::print(sys.attr("path"));
		py::module t = py::module::import("test3");
		py::object result;
		//传递int
		result = t.attr("Add")(1);
		//传递string参数
		auto resultStr = t.attr("StrTest")("Str123");
		auto outArray = result.cast<int>();
		printf("outArray:%d\n", outArray);
		printf("Str:%s", resultStr.cast<string>());
	}
	catch (std::exception& e)
	{
		cout << "call python transpose failed:" << e.what() << endl;
	}
}

四、C++调用Python Demo完整源码

 

标签:调用,Python,py,程序,扩展性,python,C++,pybind11
From: https://www.cnblogs.com/lidabo/p/17836793.html

相关文章

  • C++通过pybind11调用Python 实现transpose
    在某些场合需要在C++实现类似numpy的numpy.transpose(a,axes)功能,但是很多库如NumCpp都没有提供这样的方法,只有二维矩阵的转置,没法进行多维矩阵任意维度的转换。比较简单的想法就是利用numpy现有的功能,在c++代码里面通过调用python来调用Numpy的transpose。直接调用Python提......
  • C++调用python踩坑记录
     目录0、参考文档及博客1、环境配置步骤2、C++调用python的方法代码框架:(同样来源于上面这篇博客,可用于测试环境配置成功与否)报错处理函数(1)处理方法一:PyErr_Print(2)处理方法二:PyErr_Fetch2.5、终极解决方案3、踩坑记录(1)python第三方库调用出错(2)python模块环......
  • uniapp微信小程序图片裁剪插件,支持自定义尺寸、定点等比例缩放、拖动、图片翻转、剪切
    uniapp微信小程序图片裁剪插件,支持自定义尺寸、定点等比例缩放、拖动、图片翻转、剪切圆形/圆角图片、定制样式,功能多性能高体验好注释全。1.效果预览:      5.引入插件项目代码:Homilier/qf-image-cropper·GitCode使用HBuilderX导入项目:图片裁剪插件-DCloud......
  • C#调用C++动态库接口函数和回调函数方法 后续
    声明回调委托,C#的委托可以实现C#调用C++的回调,操作函数以后的回调//定义委托,CallingConvention.StdCall可以,CallingConvention.Cdecl不行,参考https://www.it1352.com/1792610.html//[UnmanagedFunctionPointer(CallingConvention.Cdecl)]//不需要要添加该句话,具体参考//htt......
  • 开源一套快速部署程序的工具(CI/CD)
    随着微服务越写越多,程序发布就成了一个麻烦事,所以写了一个部署工具Vela,只要填写一个git地址、编译命令等简单信息,就能自动完成程序的部署。Vela特性:代码可在任意一台电脑自动完成编译,再自动上传至服务器可指定程序以Docker容器方式运行编译命令采用终端运行,理论支持......
  • vs code开发微信小程序配置
    安装小程序开发助手安装vscode-wechat安装wxml安装wechat-snippet安装vscodewxml安装vscodeweappapi......
  • 【转】[SQL Server]在尝试加载程序集 ID 65545 时 Microsoft .NET Framework 出错。
    转自:https://blog.51cto.com/u_15075521/3979736消息10314,级别16,状态11,第44行在尝试加载程序集ID65545时Microsoft.NETFramework出错。服务器可能资源不足,或者不信任该程序集。请重新运行查询,或检查有关的文档了解如何解决程序集信任问题。有关此错误的详细信息:Syst......
  • C#调用C++动态库接口函数和回调函数方法
    这篇文章主要介绍了C#调用C++动态库接口函数和回调函数方法,通过C++端编写接口展开内容,文章介绍详细具有一定的参考价值,需要的小伙伴可以参考一下需求: 当前C已经写好了一个动态库,完成了产品开发需求,C#需要调用C编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函......
  • React Native开发App应用程序有哪些优缺点?
    Hello,各位同学们好,我是咕噜铁蛋!今天呢我和大家讲讲另外一种移动应用开发框架reactnative。在快节奏的市场竞争中,企业和开发者追求同时在不同平台上快速发布应用,而跨平台开发框架正是满足这一需求的理想选择之一。作为Facebook推出的开源跨平台移动应用开发框架,ReactNative自2015......
  • 小程序性能“神器”大揭秘!用小程序性能工具轻松搞定性能瓶颈!
    引言:Hello,小程序小能手们!是不是有时候感觉小程序加载速度慢得像是在等电梯?别着急,今天咱们要介绍的是“小程序性能工具”——就像是小程序的“私人调查员”,能帮你找出性能的瓶颈在哪里,让你的小程序速度飙升!在这次的“神器之旅”中,我们将一起揭开小程序性能工具的神秘面纱,告诉你如何......