目标

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

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

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

0.准备阶段

1)下载python

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

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

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

2)创建项目

建立一个C++控制台应用
在这里插入图片描述
然后,我选择Releasex64。(我选debug版时,会报找不到lib的问题)
在这里插入图片描述

3)配置路径

include文件夹加入附加包含目录(头文件目录):
在这里插入图片描述
libs文件夹加入附加库目录
在这里插入图片描述
将所有dll拷贝到工程目录下:
在这里插入图片描述

实验1:运行一条python语句

C++代码如下:

#include <Python.h>

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

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

输出:
在这里插入图片描述

实验2:调用python中的函数

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

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

在C++中,需要导入这个文件(也就是模块)。为了能让YaksueTest.py被找到,我将其放到了exe文件的同级目录:
在这里插入图片描述
C++代码:

#include <Python.h>

#include<iostream>

//调用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;
}

输出:
在这里插入图片描述

疑问探究:具体的lib文件是如何链接的

我在【配置路径】的步骤中,将libs文件夹加入了附加库目录
在这里插入图片描述
然而,这只是加入了lib文件的路径,并没有对具体的库进行链接。比如在《创建一个最小的D3D11实例》中,我在加入lib的路径之后,又在配置中指定了对具体哪个库进行链接。那么在当前的工程里,“链接具体的库”是如何办到的呢?

我知道除了在工程中配置的方法,也可以通过pragma comment进行这一操作。于是进行操作,发现果不其然:
在这里插入图片描述
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐