C++ 调用python

2023-10-31

本文代码已在vs2017上验证。

c++调用python需要三类文件,这些文件都可以在python安装目录下找到。

(1)include文件夹:位于python目录下。

(2)dll文件,位于python目录下,如python37.dll。

(3)lib文件,位于python目录的libs文件夹下,如python37.lib。

1、将这三类文件复制到自己工程的文件夹下,最好与cpp代码在同一个目录。

2、添加include路径,项目->属性->C/C++->常规->附加包含目录:

3、添加python37.lib,项目->属性->链接器->输入->附加依赖项:

 4、在环境变量中增加PYTHONHOME,取值为python安装目录,一般为python.exe所在目录。否则会报错误:ModuleNotFoundError: No module named 'encodings'。设置步骤:邮件此电脑->高级系统设置->高级->环境变量->新建系统环境变量PYTHONHOME。注意:设置完之后,一定要重启vs工程,否则仍然会报该错误

5、python demo代码

#coding:utf-8
import os

def run(com):
    return com + ' @ python return'
def main():
    print(run(("test")))

if __name__=='__main__':
   pass

6、C++代码,如果需要传递中文参数,请按下面代码进行gbk和utf8的编码转换;如果是英文参数,则不需要转换。编码介绍:C++ gbk与utf8互转

#include <iostream>
#include <Python.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <windows.h>

using namespace std;

string GBK_2_UTF8(string gbkStr)
{
	string outUtf8 = "";
	int n = MultiByteToWideChar(CP_ACP, 0, gbkStr.c_str(), -1, NULL, 0);
	WCHAR *str1 = new WCHAR[n];
	MultiByteToWideChar(CP_ACP, 0, gbkStr.c_str(), -1, str1, n);
	n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
	char *str2 = new char[n];
	WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
	outUtf8 = str2;
	delete[]str1;
	str1 = NULL;
	delete[]str2;
	str2 = NULL;
	return outUtf8;
}

string UTF8_2_GBK(string utf8Str)
{
	string outGBK = "";
	int n = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, NULL, 0);
	WCHAR *str1 = new WCHAR[n];
	MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, str1, n);
	n = WideCharToMultiByte(CP_ACP, 0, str1, -1, NULL, 0, NULL, NULL);
	char *str2 = new char[n];
	WideCharToMultiByte(CP_ACP, 0, str1, -1, str2, n, NULL, NULL);
	outGBK = str2;
	delete[] str1;
	str1 = NULL;
	delete[] str2;
	str2 = NULL;
	return outGBK;
}

int main()
{
	//***python调用***//
	//初始化python模块
	Py_Initialize();
	// 检查初始化是否成功
	if (!Py_IsInitialized())
	{
		cout << "初始化失败" << endl;
		Py_Finalize();
	}

	PyObject *pModule;
	PyObject*pFunc = NULL;
	PyObject*pArg = NULL;
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");//设置python模块,搜寻位置,文件放在.cpp文件一起

	pModule = PyImport_ImportModule("demo");//Python文件名: demo.py
	if (!pModule) {
		cout << "py文件导入失败" << endl;
		Py_Finalize();
	}
	else {
		pFunc = PyObject_GetAttrString(pModule, "run");//Python文件中的函数名
		if (!pFunc) {
			cout << "函数导入失败" << endl;
			Py_Finalize();
		}
		std::string a = "{\"type\": \"文字\", \"wxid\": \"lianghua-2021\", \"wxname\": \"微信聊天机器人\", \"source\": \"好友消息\", \"msgSender\": \"NULL\", \"content\": \"公众号:微聊机器人\"}";
		PyObject* pyParams = Py_BuildValue("(s)", GBK_2_UTF8(a).c_str());//c++类型转python类型,传入参数

		char * result1;
		//string result1;
		pArg = PyEval_CallObject(pFunc, pyParams);//调用函数
		PyArg_Parse(pArg, "s", &result1);//python类型转c++类型
		cout << UTF8_2_GBK(result1) << endl;

		system("pause");
	}
}

7、注意事项:

(1)x86 32位和x64 64位编译环境下需要相应的python库也为32位或64位callpython.zip;32位python或64位python安装方式见:conda 安装32位python

(2)在debug模式下,需要将python37.lib重命名为python37_d.lib,并在属性链接器的输入中对应修改。

(3)切换环境是记得同步更新PYTHONHOME环境变量。但设置完之后conda路径会失效,除非再删除该环境变量。

32位和64位完整代码:callpython.zip

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

C++ 调用python 的相关文章

随机推荐

  • 反射、线程

    反射 如何在程序运行的情况下去创建另外一个对象 JAVA反射机制是在运行状态中 对于任意一个类 都能够知道这个类的所有属性和方法 对于任意一个对象 都能够调用它的任意一个方法和属性 这种动态获取的信息以及动态调用对象的方法的功能称为java
  • CNN浅析和历年ImageNet冠军模型解析

    版权声明 作者 黄文坚 本文为大数据杂谈4月13日微信社群分享内容整理 最新人工智能论文 http paperreading club 今天在这里我给大家讲解一些深度学习中卷积神经网络的原理和一些经典的网络结构 卷积神经网络原理浅析 卷积神
  • 苹果系统版本依次顺序_iphone所有型号上市顺序

    Ready 本期给大家讲讲iphone所有型号上市顺序 第一代iPhone于2007年1月9日由苹果公司前首席执行官史蒂夫 乔布斯发布 并在2007年6月29日正式发售 第二代iPhone 3G于2008年6月10日由美国苹果公司的掌门人史
  • 【Linux之shell脚本实战】统计 Linux 进程相关数量信息

    Linux之shell脚本实战 统计 Linux 进程相关数量信息 一 脚本要求 二 检查本地服务器状态 1 检查系统版本 2 检查系统内核版本 三 配置脚本注释模板 1 编辑 vimrc 文件 2 检查模板生效情况 四 编写ps aa s
  • 0基础速通MySql基础

    一 基本配置 经过一系列配置后 可以与客户端进行连接 二 基本操作 数据模型 1 关系型数据库 RDBMS 概念 建立在关系模型基础上 由多张相互连接的二维表组成的数据库 2 数据模型 MySQL是关系型数据库 是基于二维表进行数据存储的
  • 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板

    正点原子阿波罗STM32F429开发板资料发布 采用底板 核心板 https www amobbs com thread 5654611 1 1 html 正点原子STM32开发板 http www openedv com docs boa
  • IP addr添加网络的使用

    IP addr 添加网络的使用 添加IP到网口 root localhost ip addr add 192 168 10 100 24 dev em1 查看添加的IP root localhost ip addr show 移除添加的IP
  • 卸载或重新安装JDK出现"Windows Installer程序包有问题,此安装需要的DLL不能运行"解决方法(转)

    首先确保windows installer服务是开启的 运行services msc 看看windows installer服务是否启动 先启动看看能否解决 当然本人的是一直启动着的但还是卸载不了 想办法去删注册表却删不全 总是没法解决 之
  • 期货反向跟单的四大跟单禁忌

    对于在反向跟单路上的朋友 经典的 二八定律 这么完美 它依然坚不可摧 但是跟单落地的结果却不一定能成功 反向跟单经验已经做过多次介绍 不过成功各有不同 但是误区无非就以上几个 1忌 不加筛选 盲目乱跟 跟单的样本数据 必须经过筛选 不能不管
  • Arthas & GC日志-JVM(十八)

    上篇文章说jvm的实际运行情况 Jvm实际运行情况 JVM 十七 Arthas介绍 因为arthas完全是java代码写的 我们直接用命令启动 Java jar arthas boot jar 启动成功后 选择我们项目的进程 进入我们可用d
  • Uniapp学习之从零开始写一个简单的小程序demo(新建页面,通过导航切换页面,发送请求)

    先把官网文档摆在这 后面会用到的 uniapp官网文档 https uniapp dcloud net cn vernacular html 一 开发工具准备 1 1 安装HBuilder 按照官方推荐 先装一个HBuilder 下载地址
  • 修复maven缓存导致Jenkins打包失败

    问题 笔者近期在公司搭建了一个内网的nexus 所以每次有新项目要部署到Jenkins时需要使用脚本将相关依赖导入到nexus上 近期笔者在Jenkins配置了一个item报错 然后将相关依赖导入nexus中 再次打包时出现下面这段异常 笔
  • 【VUE】在vue项目实践当中使用swiper轮播图教程

    步骤 1 安装vue awesome swiper npm install vue awesome swiper S 2 在vue项目中引用vue awesome swiper main js import VueAwesomeSwiper
  • Java是面向过程语言还是面向对象语言?

    目录 一 面向过程语言 二 面向对象语言 三 Java是面向过程语言还是面向对象语言 一 面向过程语言 面向过程语言是一种编程范式 它将程序设计看作是按照一定的步骤或流程进行处理的过程 在面向过程语言中 程序员需要自己定义数据结构和算法 并
  • linux的链接方式

    linux的硬链接和软链接 1 链接的概念 Linux链接分两种 一种被称为硬链接 Hard Link 另一种被称为软链接也叫符号链接 Symbolic Link 默认情况下 ln命令产生硬链接 2 硬链接 在Linux文件系统当中 保存在
  • 年入50万,程序员的第二条赛道

    大家好 我是厂长 我有个朋友 叫佩佩 这几年我亲眼见证了她从月薪6千 到年入百万 她曾经靠一条短视频带货就赚了30万佣金 最近 我看到她在做小红书无货源电商这个风口项目 两个月就做到了单店30万的战绩 她说2023年是小红书电商元年 0粉
  • 回味C语言

    虽然在实际上没怎么使用C语言了 但是看到C语言的书总是忍不住想看一下 喜欢这种至简 却又有着强大能力的语言 读完书随手写的一些笔记 略有些简单 书还是很喜欢的 推荐给大家 C专家编程 第一章 C 穿越时空的迷雾 原型决定C语言不支持函数重载
  • 小程序面试题

    1 简单描述一下微信小程序的相关文件类型 答 WXML WeiXin Markup Language 是框架设计的一套标签语言 结合基础组件 事件系统 可以构建出页面的结构 内部主要是微信自己定义的 套组件 WXSS WeiXin Styl
  • mysql 利用binlog增量备份,还原实例(日志备份数据库)

    一 什么是增量备份 增量备份 就是将新增加的数据进行备份 假如你一个数据库 有10G的数据 每天会增加10M的数据 数据库每天都要备份一次 这么多数据是不是都要备份呢 还是只要备份增加的数据呢 很显然 我只要备份增加的数据 这样减少服务器的
  • C++ 调用python

    本文代码已在vs2017上验证 c 调用python需要三类文件 这些文件都可以在python安装目录下找到 1 include文件夹 位于python目录下 2 dll文件 位于python目录下 如python37 dll 3 lib文