如何在C++中调用Python
在实际应用场景中,我们可能需要在C++程序中调用Python脚本来完成某些任务。本文将介绍如何在C++中调用Python,并提供两个示例说明。
- 安装Python
在C++中调用Python,首先需要在计算机上安装Python。可以从Python官网上下载安装包,安装好之后将Python的路径添加到环境变量中。
- 安装Python库
在Python脚本中,有很多常用的库,比如numpy、matplotlib等。如果需要调用这些库,需要在C++中安装对应的Python库。可以使用pip命令进行安装,比如:
pip install numpy
pip install matplotlib
如果安装时速度较慢,可以使用清华镜像进行加速。
- 在C++中调用Python
在C++中调用Python需要用到Python提供的C API。可以通过下面的代码引入Python的头文件:
#include <Python.h>
然后在C++中,可以通过Python提供的API创建Python的解释器和模块,并调用Python模块中的函数。
下面是一个调用Python脚本中的函数的示例代码:
#include <Python.h>
int main()
{
Py_Initialize(); // 初始化Python解释器
PyObject* pModule = PyImport_ImportModule("test.py"); // 导入Python模块
if (pModule != NULL)
{
PyObject* pFunc = PyObject_GetAttrString(pModule, "add"); // 获取Python模块中的函数
if (pFunc && PyCallable_Check(pFunc)) // 判断是否为可调用对象
{
PyObject* pArgs = PyTuple_New(2); // 创建2个参数的元组
PyObject* pArg1 = PyLong_FromLong(1); // 转换C++中的数据类型为Python中的数据类型
PyObject* pArg2 = PyLong_FromLong(2);
PyTuple_SetItem(pArgs, 0, pArg1); // 将元组中的参数设置为实际值
PyTuple_SetItem(pArgs, 1, pArg2);
PyObject* pRet = PyObject_CallObject(pFunc, pArgs); // 调用Python函数,并获取返回值
if (pRet != NULL) // 如果返回值不为空,输出返回值
{
printf("result: %d\n", PyLong_AsLong(pRet));
Py_DECREF(pRet);
}
Py_DECREF(pFunc);
Py_DECREF(pArgs);
}
Py_DECREF(pModule);
}
Py_Finalize(); // 结束Python解释器
return 0;
}
上面的代码中,通过PyImport_ImportModule函数导入了test.py模块,并通过PyObject_GetAttrString函数获取了add函数。然后使用PyTuple_New创建了一个包含两个参数的元组,并使用PyTuple_SetItem设置了元组中的参数值。最后通过PyObject_CallObject调用Python函数,并获取返回值。
另外一个调用Python函数的示例代码如下:
#include <Python.h>
int main()
{
Py_Initialize(); // 初始化Python解释器
PyRun_SimpleString("import sys\n");
PyRun_SimpleString("sys.path.append(\".\")\n"); // 添加Python脚本路径
PyObject* pName = PyUnicode_FromString("test");
PyObject* pModule = PyImport_Import(pName); // 导入Python模块
Py_DECREF(pName);
if (pModule != NULL)
{
PyObject *pFunc = PyObject_GetAttrString(pModule, "hello"); // 获取Python模块中的函数
if (pFunc && PyCallable_Check(pFunc)) // 判断是否为可调用对象
{
PyObject* pArgs = PyTuple_New(0); // 创建0个参数的元组
PyObject* pRet = PyObject_CallObject(pFunc, pArgs); // 调用Python函数,并获取返回值
if (pRet != NULL) // 如果返回值不为空,输出返回值
{
printf("%s\n", PyUnicode_AsUTF8(pRet));
Py_DECREF(pRet);
}
Py_DECREF(pFunc);
Py_DECREF(pArgs);
}
Py_DECREF(pModule);
}
Py_Finalize(); // 结束Python解释器
return 0;
}
上面的代码中,通过PyImport_Import函数导入了test.py模块,并通过PyObject_GetAttrString函数获取了hello函数。然后创建了一个不包含参数的元组,并使用PyObject_CallObject调用Python函数,并获取返回值。
以上是在C++中调用Python的基本流程,读者可以根据实际应用需求对代码进行适当的修改和扩展。
示例说明
- 在C++中使用Python调用OpenCV实现图像读取
首先需要在C++中安装OpenCV库,在Python中安装numpy和OpenCV库。然后在Python中编写图像读取的脚本,如下所示:
import cv2
def read_image(path):
img = cv2.imread(path)
return img
在C++程序中,可以通过以下代码调用上述脚本中的read_image函数:
#include <Python.h>
#include <iostream>
#include "opencv2/opencv.hpp"
int main()
{
Py_Initialize(); // 初始化Python解释器
PyObject* pModule = PyImport_ImportModule("read_image.py"); // 导入Python模块
if (pModule != NULL)
{
PyObject* pFunc = PyObject_GetAttrString(pModule, "read_image"); // 获取Python模块中的函数
if (pFunc && PyCallable_Check(pFunc)) // 判断是否为可调用对象
{
PyObject* pArgs = PyTuple_New(1); // 创建1个参数的元组
PyObject* pArg1 = PyUnicode_FromString("./test.jpg"); // 创建参数值
PyTuple_SetItem(pArgs, 0, pArg1); // 将元组中的参数设置为实际值
PyObject* pRet = PyObject_CallObject(pFunc, pArgs); // 调用Python函数,并获取返回值
if (pRet != NULL) // 如果返回值不为空,将返回值转换为OpenCV图像并显示
{
Py_INCREF(pRet);
PyArrayObject* np_ret = reinterpret_cast<PyArrayObject*>(pRet);
cv::Mat img(cv::Size(np_ret->dimensions[1], np_ret->dimensions[0]), CV_8UC3, np_ret->data, cv::Mat::AUTO_STEP);
cv::imshow("result", img);
cv::waitKey(0);
Py_DECREF(pRet);
}
Py_DECREF(pFunc);
Py_DECREF(pArgs);
}
Py_DECREF(pModule);
}
Py_Finalize(); // 结束Python解释器
return 0;
}
上述代码中,通过PyImport_ImportModule导入了read_image.py脚本,并通过PyObject_GetAttrString获取了read_image函数。然后创建了一个包含一个参数值的元组,并调用Python函数。最后,将返回值转换为OpenCV图像并显示出来。
- 在C++中使用Python实现加法运算
在Python脚本中编写一个实现加法运算的函数,代码如下:
def add(a, b):
return a + b
在C++程序中,可以通过以下代码调用上述脚本中的add函数:
#include <Python.h>
#include <iostream>
int main()
{
Py_Initialize(); // 初始化Python解释器
PyObject* pModule = PyImport_ImportModule("test.py"); // 导入Python模块
if (pModule != NULL)
{
PyObject* pFunc = PyObject_GetAttrString(pModule, "add"); // 获取Python模块中的函数
if (pFunc && PyCallable_Check(pFunc)) // 判断是否为可调用对象
{
PyObject* pArgs = PyTuple_New(2); // 创建2个参数的元组
PyObject* pArg1 = PyLong_FromLong(1); // 创建参数值
PyObject* pArg2 = PyLong_FromLong(2);
PyTuple_SetItem(pArgs, 0, pArg1); // 将元组中的参数设置为实际值
PyTuple_SetItem(pArgs, 1, pArg2);
PyObject* pRet = PyObject_CallObject(pFunc, pArgs); // 调用Python函数,并获取返回值
if (pRet != NULL) // 如果返回值不为空,输出返回值
{
printf("result: %d\n", PyLong_AsLong(pRet));
Py_DECREF(pRet);
}
Py_DECREF(pFunc);
Py_DECREF(pArgs);
}
Py_DECREF(pModule);
}
Py_Finalize(); // 结束Python解释器
return 0;
}
上述代码中,通过PyImport_ImportModule导入了test.py脚本,并通过PyObject_GetAttrString获取了add函数。然后创建了一个包含两个参数值的元组,并调用Python函数。最后输出返回值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在C++中调用Python - Python技术站