实践在C++中调用Python函数
目标目标是在C++中调用Python函数,给定输入,得到输出。主要参考:如何实现 C/C++ 与 Python 的通信? - 知乎C++调用Python脚本中的函数 - Achimesir - 博客园0.准备阶段1)下载python在官网上下载python。我选择的是64位安装版:随后会在安装目录找到一些需要的东西:include文件夹:里面是一些C语言代码头文件。其中将存放着供C语言调用的函数的
目标
目标是在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++控制台应用
然后,我选择Release
和x64
。(我选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进行这一操作。于是进行操作,发现果不其然:
更多推荐
所有评论(0)