C++与python的联合编程

C++调用python代码

  • 前言
  • 一、调用的流程。
      • 1、初始化python环境
      • 2、调用.pyd或.py文件
      • 3、加载类/函数

前言

在项目开始中,需要使用c++调用python代码,因为资料少。并且在项目开发的过程中,很多的C++多线程的知识,讲述的不是很清楚,另外需要把c++对象转述为python对象的内容,几乎不存在。写下这篇博客用于记录和给需要的人一些帮助。

一、调用的流程。

c++调用python代码时,需要以下步骤。

1、初始化python环境

使用代码

Py_Initialize();	
(这里写入c++调用python的代码)
Py_Initialize();	

Py_Initialize():函数用于初始化Python解释器。它会执行一些必要的初始化操作,包括创建主模块、内建模块和内建函数等。在调用Py_Initialize()之前,需要确保Python解释器已经被正确地初始化,并且已经设置了相关的环境变量。
Py_Finalize():函数用于终止Python解释器。它会执行一些清理操作,包括释放Python解释器占用的资源和内存。
注意:
在c++代码中,c++代码对python代码的调用只能在这两个函数之间,如果没有在这两函数之外,会出现错误,导致初始初始化失败。如果你想把这个环境封装在一个类中,那你可以在构造函数和析构函数中使用。

 class MyClass {
public:
    MyClass() {
        Py_Initialize()}

    ~MyClass() {
        Py_Finalize();
    }
};

2、调用.pyd或.py文件

a、初始化的准备

PyRun_SimpleString("import os,sys");// 执行import语句
PyRun_SimpleString("sys.path.append('./')"); // 把当前路径加入路径中,为了找到相应的PYD文件

注意
以上代码PyRun_SimpleString(“sys.path.append(‘./’)”); 可以通过调整这句话,可以指向的py或pyd文件放在文件中的位置。
b、导入.py文件或.pyd文件
这里是加载py或pyd文件,

PyObject* pModuleName = PyUnicode_FromString("SIVIDeploy");         // 把c++字符串变为puobject对象,
PyObject* pModule = PyImport_Import(pModuleName);    				// 导包

// 上述两句话可以比对于python代码中的一句话 import SIVIDeploy ,但是因为你使用c++与python的联合编程中,
// 对于python的操作,你只能是pyobject 对象。所以,在这里你需要把c++中的字符串,转化为python里面的字符串,
// 所以需要使用 PyUnicode_FromString 这个函数 

3、加载类/函数

加载函数,分为以下情况。
1、属于.py或pyd文件里面直接加载函数
2、从类里面调用python函数

函数介绍:

PyObject* PyObject_GetAttrString(PyObject *obj, const char *attr_name)

PyObject_GetAttrString 用于获取一个Python对象的属性。
参数解释:
obj:一个Python对象,可以是模块、类、实例或其他类型的对象。
attr_name:一个字符串,表示要获取的属性的名称。
返回值:
如果成功找到属性,返回一个新的引用对象,即该属性的值。
如果找不到属性,返回NULL,并且会设置相应的异常信息。

PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)

用于调用一个Python函数,并传递一系列参数。
参数解释:
callable:一个可调用的Python对象,可以是一个函数、方法、类或其他可调用的对象。
…:可变数量的参数,以NULL作为结束标志。这些参数将被传递给callable对象的调用。
NULL:作为结束标志,表示参数列表的结束。
返回值:

如果调用成功,返回一个新的引用对象,即callable对象的返回值。
如果调用失败,返回NULL,并且会设置相应的异常信息。

PyObject* PyObject_CallObject(PyObject *callable, PyObject *args)

用于调用一个可调用的Python对象。
参数解释:
callable:一个可调用的Python对象,可以是一个函数、方法、类或其他可调用的对象。
args:一个包含参数的元组或NULL。如果传递了参数,它们将作为可调用对象的参数传递进去。
返回值:
如果调用成功,返回一个新的引用对象,即可调用对象的返回值。
如果调用失败,返回NULL,并且会设置相应的异常信息。

PyObject* people = PyObject_GetAttrString(personClass,"hai");         // 获得类里面需要调用的函数名字,把c++的字符串,变成python的字符串
PyObject *pArgs = PyTuple_New(1); // 创造一个长度为1的python的元组
PyTuple_SetItem(pArgs, 0, Py_BuildValue(“i”, 1));//0—序号 i表示创建int型变量,数字1表示数值
peopleInstance = PyObject_CallObject(people, pArgs); //不传递参数可以使用nullptr 
/
PyObject* people = PyObject_GetAttrString(personClass,"hai");
PyObject* study = PyUnicode_FromString("字符串");
pModelName = PyObject_CallFunctionObjArgs(people, study, nullptr); // 记得使用nullptr作为结束标志。           

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