这里有几个参考的:
1) 这个。
比较全面的,详细的介绍了下情况。
2)这个,很有用演示了c++调用python的各种参数转换例子,包括字符串,数值,数组,类,list等转换方法
3)这个,介绍了一些py接口的函数。
3)这个;
这个2。
可以看,但是不是特别有信息量。
4)官方介绍:https://docs.python.org/3.9/extending/index.html
python自己封装了一个库,需要引用这个库。做一些头文件和库的配置。
网上的介绍比较多。这里有一个Ubuntu下的一个库的设置。如下:其他的情况自己搜索一下吧。
c++调用接口可以访问函数、类、参数等,全部封装成了一个pyobject类,用完这个需要清除,清除的方法为:
函数调用有两种方法:
类调用,2】中有介绍,这里给一个例子。如下:
很多地方都介绍到了。见1】的介绍。
简单点说,数值通过BuildValue来生成。
c++下的int和bool变量/值都可以传给python,转换为bool数值。
其中,如果是int的转换规则为:0转换为False。其他都转换为True;bool则直接转。
给个例子:
注意:本例子使用了另外一个调用函数的方式。
#文件 Test.py,路径:./home/kv
def TestBool( isTest):
if isTest:
print("True")
else:
print("False")
int main()
{
Py_Initialize();
if (!Py_IsInitialized())
{
cout << "初始化失败" << endl;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./home/kv')");
PyObject* pModel = nullptr;
pModel = PyImport_ImportModule("Test");
// 调用func
PyObject_CallMethod(pModel, "TestBool","i",1); //True
// 调用func
PyObject_CallMethod(pModel, "TestBool","i",0); //False
PyObject_CallMethod(pModel, "TestBool","i",-1); //True
bool isTest = true;
PyObject_CallMethod(pModel, "TestBool","i",isTest); //True
isTest = false;
PyObject_CallMethod(pModel, "TestBool","i",isTest); //False
Py_DecRef(pDict);
Py_DecRef(pModel);
Py_Finalize();
return 0;
}
Mat的方法参见:这里
本人的一个例子,如下:
其中调用的文件为ImgHandle.py,路径为:/home/…/calledPythonFilePath
#include
#include
#include
#include
#include
using namespace cv;
//将Mat封装为直接可以传的参数,不许在封装了!
PyObject *cvmat2py(cv::Mat &image)
{
import_array();
int row, col;
col = image.cols; //列宽
row = image.rows; //行高
int channel = image.channels();
int irow = row, icol = col * channel;
npy_intp Dims[3] = {row, col, channel}; //图像维度信息
PyObject *pyArray = PyArray_SimpleNewFromData(channel, Dims, NPY_UBYTE, image.data);
PyObject *ArgArray = PyTuple_New(1);
PyTuple_SetItem(ArgArray, 0, pyArray);
return ArgArray;
}
//下面函数调用封装了调用python函数的过程
void Py_ShowImg(cv::Mat &image){
Py_Initialize();//对python进行初始化,无返回值。使用py_IsInitialized检查系统是否初始化成功。
PyRun_SimpleString("import sys");//sys模块包含了与Python解释器和它的环境有关的函数。
PyRun_SimpleString("sys.path.append('/home/.../calledPythonFilePath')");
PyObject * pModule = NULL;//声明变量
pModule =PyImport_ImportModule("ImgHandle");//这里是要调用的文件名ImgHandle.py
PyObject* pArgs = cvmat2py(image);
PyObject * pFunc = PyObject_GetAttrString(pModule, "showImg");//这里是要调用的函数名showImg,该函数一个参数为Mat,返回int。
auto *py_result = PyEval_CallObject(pFunc, pArgs);//调用函数
int c_result;
// 将python类型的返回值转换为C类型
PyArg_Parse(py_result, "i", &c_result);
std::cout << "return: " << c_result << std::endl;
Py_Finalize();// 关闭Python
}
这里有说明。
使用 PyArg_ParseTuple()方法。里面有转换的介绍。