实践在C++中调用Python函数

目标

目标是在C++中调用Python函数,给定输入,得到输出。

主要参考:
如何实现 C/C++ 与 Python 的通信? - 知乎
C++调用Python脚本中的函数 - Achimesir - 博客园

Python的C语言API官方文档:Python/C API 参考手册 — Python 文档

0.准备阶段

1)下载python

在官网上下载python。
我选择的是64位安装版:
实践在C++中调用Python函数_第1张图片
随后会在安装目录找到一些需要的东西:
实践在C++中调用Python函数_第2张图片
include文件夹
里面是一些C语言代码头文件。其中将存放着供C语言调用的函数的定义。

libs文件夹
里面是一些.lib文件。
关于存放的内容:.lib可能存着函数具体的实现,也可能是存着索引dll中函数实现的信息。由于这里的.lib文件相对较小,而且目录里有dll,所以存放的内容我想是后者。

dll文件
存着函数的具体实现

2)创建项目

建立一个C++控制台应用
实践在C++中调用Python函数_第3张图片
然后,我选择Releasex64。(我选debug版时,会报找不到lib的问题)
在这里插入图片描述

3)配置路径

include文件夹加入附加包含目录(头文件目录):
实践在C++中调用Python函数_第4张图片
libs文件夹加入附加库目录
实践在C++中调用Python函数_第5张图片
将所有dll拷贝到工程目录下:
实践在C++中调用Python函数_第6张图片

实验1:运行一条python语句

C++代码如下:

#include 

int main()
{
     
	//程序名:
	Py_SetProgramName(L"TestYaksue");
	
	//初始化
	Py_Initialize();

	//运行一个语句
	PyRun_SimpleString("print('Hello World in Python!')\n");
	
	Py_Finalize();
	
	return 0;
}

输出:
实践在C++中调用Python函数_第7张图片

实验2:调用python中的函数

YaksueTest.py文件中定义一个叫MyFunc的函数:

def MyFunc(InParm):
    print("InParm:"+str(InParm))
    return InParm*3;

在C++中,需要导入这个文件(也就是模块)。为了能让YaksueTest.py被找到,我将其放到了exe文件的同级目录:
实践在C++中调用Python函数_第8张图片
C++代码:

#include 

#include

//调用python的函数
int CallPythonFunction(int InParm)
{
     
	//导入文件(模块)  
	PyObject* pModule = PyImport_ImportModule("YaksueTest");

	//找到函数的地址
	PyObject* pFunc = PyObject_GetAttrString(pModule, "MyFunc");

	//创建参数:
	PyObject* pArgs = PyTuple_New(1);
	//设置参数的值
	PyTuple_SetItem(pArgs, 0, PyLong_FromLong(InParm));

	//调用函数
	PyObject* pReturnValue = PyObject_CallObject(pFunc, pArgs);

	//转换为C语言类型并返回
	return PyLong_AsLong(pReturnValue);
}

int main()
{
     
	//程序名:
	Py_SetProgramName(L"TestYaksue");
	
	//初始化
	Py_Initialize();

	//运行函数
	int value = CallPythonFunction(7);
	std::cout<<"CallPythonFunction: " << value << std::endl;
	
	Py_Finalize();
	
	return 0;
}

输出:
实践在C++中调用Python函数_第9张图片

你可能感兴趣的:(Python,python,c++)