C++调用Python的API

本文详细介绍了C++如何通过Python.h库调用Python模块,包括初始化环境、加载模块、导入函数、传递参数和解析返回值的过程,以及C++与Python类型转换的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 调用Python流程

  • 首先需要包含头文件 Python.h
  • 初始化Python环境 Py_Initialize()
  • 添加模块路径(或者说脚本路径)PyRun_SimpleString()
  • 导入模块PyImport_ImportModule()
  • 导入函数PyObject_GetAttrString()
  • 使用函数PyObject_CallObject()
  • 获取结果PyArg_Parse()
  • 结束释放Py_DECREF()Py_Finalize()

初始化和关闭Python解释器

所有的Python程序都要在这之间执行

#include<Python.h>
Py_Initialize();Py_Finalize();

load Python模块

直接Load一个Python写好的文件(假设文件名叫pytest.py, 在当前目录下)

PyObject *pName,*pModule;
PyRun_SimpleString("import sys"); //导入系统模块
PyRun_SimpleString("sys.path.append('./')"); //指定pytest.py所在的目录
pName = PyString_FromString("pytest"); //指定要导入的文件名
pModule = PyImport_Import(pName); //将pytest.py导入模块指针pModule

Load一个已经安装好的Python模块 (假设模块名叫pytest),不需要添加模块路径

PyObject* pModule;
pModule = PyImport_Import(PyString_FromString(“ptest”)); //将pytest导入模块指针pModule

从pModule模块里load需要调用的函数并执行

从模块里直接load一个函数 (假设函数名叫func, 有一个int型的输入变量,返回一个int型整数)

PyObject *pfunc, *args, *results;
Pfunc= PyObject_GetAttrString(pModule, "func"); //pModule是上一步load好的Python模块
args = Py_BuildValue("(i)",12345); //设置调用func时的输入变量,这里假设为12345
results= PyObject_CallObject(Pfunc, args); //执行func(12345),并将结果返回给results

从模块里load一个,然后调用类内部的函数 (假设类名叫Executor, 初始化需要当前文件夹下的配置文件config.txt, 函数名叫func)

PyObject *pClass, *pDict,*pInstance, *class_args, *results;
pDict = PyModule_GetDict(pModule); //拿到pModule里的所有类和函数定义
pClass=PyDict_GetItemString(pDict,"Executor"); //找到名为Executor的类
class_args = Py_BuildValue("(s)","./config.txt"); //设置类初始化需要的参数
pInstance=PyInstance_New(pClass, class_args, NULL ); //初始化Executor,建立实例pInstance
results=PyObject_CallMethod(pInstance,"func","(i)",12345); // 执行pInstance.func(12345)

C++向Python传递参数

因为在Python中,所有的类型都经过了一层封装,导致C++的参数需要做一个类型转换,转换成PyObject才能传入Python。例如C++的一个int就是个整数,该值占用8bytes(64位)的存储空间,而一个Python的int其实是一个PyObject 指向的24bytes的结构。前8bytes是个整数,代表引用次数,中间8bytes是个指向int类型定义的指针,最后8bytes才是这个int的值。所以C++和Python之间参数的互相传递都需要调用Python提供的API

假设函数的输入变量有三个分别为一个整数(i),一个浮点数(f)和一个字符串(s)

PyObject* args = PyTuple_New(3);
PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数
PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数
PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
PyTuple_SetItem(args, 2, arg3);

以上函数可简化为

PyObject* args = Py_BuildValue("(ifs)", 100, 3.14, "hello");

解析Python的返回值PyObject* results

同C++传递参数到Python类似,调用解析函数
单个返回值:PyArg_Parse()
多返回值:PyArg_ParseTuple()
具体例子:1.7 Format Strings for PyArg_ParseTuple()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值