如何在C++中调用python代码你知道吗

 更新时间:2021年12月30日 15:00:01   作者:yangtuanzi1118  
这篇文章主要为大家介绍了C++中调用python代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、环境设置

windows

VS2015

python的话用的是acaconda自带的python环境,不同版本的acaconda自带的python不同,我的是python3.6(这一步很重要,如果使用acaconda创建的虚拟环境的python,可能会不成功)

二、VS项目中设置

(1)首先在acaconda中找到include文件夹和libs文件夹,如图所示

然后右击C++项目,选择属性,点击VC++目录,然后在包含目录中添加include文件夹,在库目录中添加libs文件夹

(2)点击链接器,然后输入,附加依赖项,添加python36_d.lib的路径

因为配置为Debug,所以是添加python36_d.lib,而不是python36.lib。如果没有这个文件,直接复制python36.lib,然后命名为python36_d.lib即可。如图所示

(3)python代码

想要在C++代码中调用python中的vsdemo.py的max函数,首先python代码如图所示

def max(a,b):
    if a>b:
        return a
    else:
        return b

C++代码如图所示

#include <iostream>
#include<python.h>
#include"stdio.h"
using namespace std;
int main()
{
	Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
	if (!Py_IsInitialized())
	{
		printf("初始化失败!");
		return 0;
	}
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径
	PyObject* pModule = NULL;//声明变量
	PyObject* pFunc = NULL;// 声明变量
	pModule = PyImport_ImportModule("vsdemo");//这里是要调用的文件名vsdemo.py
	if (pModule == NULL)
	{
		cout << "没找到" << endl;
	}
	pFunc = PyObject_GetAttrString(pModule, "max");//这里是要调用的函数名max
	PyObject* pParams = Py_BuildValue("(ss)", "3", "4");//两个字符串参数
	char* result;
	PyObject* pRet = PyObject_CallObject(pFunc, pParams);//调用函数 pRet是得到的结果
	int res = 0;
	PyArg_Parse(pRet, "s", &result);//转换结果的返回类型
	cout << "res:" << result << endl;//输出结果
	system("pause");
	Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
	return 0;
}

同时需要把python代码,即vsdemo.py文件,放到c++项目文件中,然后再运行

三、可能会出现的问题

(1)可能会出现找不到python36.dll的错误,可以从acaconda中找到该文件,复制到c++项目文件中即可,如图所示

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C语言之双向链表详解及实例代码

    C语言之双向链表详解及实例代码

    这篇文章主要介绍了C语言之双向链表的相关资料,并附实例代码,有需要的小伙伴可以参考下
    2016-09-09
  • 一文弄懂c语言赋值截断

    一文弄懂c语言赋值截断

    截断是指将一个较宽范围的整型赋值给一个较窄范围的整型时,超出目标类型表示范围的部分被丢弃,只保留目标类型能够表示的部分,本文主要介绍了c语言赋值截断,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • VC6.0常见编译错误提示附解决方法

    VC6.0常见编译错误提示附解决方法

    这篇文章主要介绍了VC++6.0编译过程中常遇到的一些错误提示并给出了错误原因与分析,需要的朋友尅参考下
    2013-07-07
  • C语言中带返回值的宏定义方式

    C语言中带返回值的宏定义方式

    这篇文章主要介绍了C语言中带返回值的宏定义方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    本篇文章是对将两个链表非降序合并为一个链表并依然有序的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++协程实现序列生成器的案例分享

    C++协程实现序列生成器的案例分享

    序列生成器通常的实现是在一个协程内部通过某种方式向外部传一个值出去,并且将自己挂起,本文围绕序列生成器这个经典的协程案例介绍了协程的销毁、co_await 运算符、await_transform 以及 yield_value 的用法,需要的朋友可以参考下
    2024-05-05
  • C++私有继承(一)

    C++私有继承(一)

    这篇文章主要介绍了C++私有继承,在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。这意味着基类的方法都会被private关键字描述,我们可以在派生类中使用它,但类对象无法直接调用,下面来看看详细内容吧
    2022-01-01
  • C语言实现词法分析器

    C语言实现词法分析器

    这篇文章主要为大家详细介绍了C语言实现词法分析器,一个简单的词法分析程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Android App仿微信界面切换时Tab图标变色效果的制作方法

    Android App仿微信界面切换时Tab图标变色效果的制作方法

    这篇文章主要介绍了Android App仿微信界面切换时Tab图标变色效果的制作方法,重点讲解了图标的绘制技巧,需要的朋友可以参考下
    2016-04-04
  • C++ opencv图像处理实现图片几何变换示例

    C++ opencv图像处理实现图片几何变换示例

    这篇文章主要为大家介绍了C++ opencv图像处理实现图片几何变换示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论