首页 > 编程语言 >C++调用Python的API总结

C++调用Python的API总结

时间:2023-01-30 14:13:31浏览次数:54  
标签:Py Python args results C++ PyObject API pModule

最近在做C++调Python的work,简单总结下

(初始化和关闭Python解释器

#include<Python.h>

Py_Initialize();

Py_Finalize();

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

() load Python模块

又分为以下两种方式

(1) 直接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

(2) Load一个已经安装好的Python模块 (假设模块名叫pytest)

PyObject* pModule;

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

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

又分为以下两种方式

(1) 从模块里直接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

(2) 从模块里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 (o)

PyObject* args = Py_BuildValue("(o)", results);

具体参数格式Parsing arguments and building values

(解析Python的返回值PyObject* results

同C++传递参数到Python类似,调用解析函数

单个返回值:PyArg_Parse()

多返回值:PyArg_ParseTuple()

具体例子:1.7 Format Strings for PyArg_ParseTuple()

(编译执行

假设写好的文件名为example_python.cpp, 想要编译出的可执行文件叫Test, 可用命令

g++ example_python.cpp -o Test -I/usr/include/python2.7/ -lpython2.7

标签:Py,Python,args,results,C++,PyObject,API,pModule
From: https://www.cnblogs.com/lidabo/p/17075705.html

相关文章

  • C++调用python脚本
    随着机器学习/深度学习这几年的的火热,python成了当红炸子鸡,使用python训练机器学习模型则成了开发人员们最喜欢的方法,但是由于过往调度系统一般都是用C++来开发的,因此......
  • Swagger测试Restful API
    swagger出现背景我们构建RestfulAPI的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端,不同端由......
  • 集合框架体系Collection和Map常用API【汇总】
    集合框架体系Collection和Map常用API【汇总】Collection公共的方法Collection是单列结合的顶层接口,它的方法是所有单列集合都可以继承使用的。//把给定元素添加到集......
  • python获取系统盘符列表
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#需求:#动态捕获指定服务器最新发布接种应用系统路径,重......
  • python接口测试常见问题。
    一.入参问题1.body字段类型1.如果数据是从excel提取的那么中文数据会提示错误。解决方法#media_value['body']=media_value['body'].encode("utf-8").decode("latin1......
  • Python自动批量修改文件名称的方法
      本文介绍基于Python语言,按照一定命名规则批量修改多个文件的文件名的方法。  已知现有一个文件夹,其中包括班级所有同学上交的作业文件,每人一份;所有作业文件命名格式......
  • 【7】Python3函数
    Python函数函数是一个被命名的、独立的、完成特定功能的可重复使用的代码段,其可能给调用它的程序一个返回值。 被命名的:在Python中,大部分函数都是有名函数完成特定功......
  • C/C++自助攒机系统[2023-01-30]
    C/C++自助攒机系统[2023-01-30]自助攒机系统管理员可以录入如下几种硬件的价格、型号信息:CPU:主频、品牌、价格、图片硬盘:容量、品牌、价格显示器:尺寸、品牌、价格......
  • 【KAWAKO】audiotsm-使用python对音频进行变速不变调处理
    目录安装库导入相关库定义reader定义writer定义WSLOA算法,并运行官方手册源码安装库pipinstallaudiotsm导入相关库importaudiotsmimportaudiotsm.io.wavimpo......
  • python语法到底多精妙?八大核心语句,带你深度了解
    Python是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视Python语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现Python语法之精妙的十......