C++调用Python(二)

以下为授权转载的一盎司科技公众号文章


鉴于Python有大量丰富的库,而且较为灵活,所以C++里面也会根据不同场景,调用Python来实现某些业务逻辑。

上一篇简单介绍C++中调用Python的函数,这里将介绍列表,字典作为出入参以及引用计数等,关于Python的C API的详细内容可参考官方文档(https://docs.python.org/3.10/c-api/index.html)。

示例代码地址:

GitHub地址:https://github.com/iounce/python-cpp-demo

Gitee地址:https://gitee.com/iounce_admin/python-cpp-demo

环境

  • Windows操作系统:Windows10(21H2,19044.1766)

  • C++开发环境:Visual Studio 2022社区版

  • Python:3.10.4

  • PyBind11:2.11.1

列表出入参

  • 列表入参:列表作为入参相对整型,字符串等要复杂一些,但基本用法是相同的。首先还是使用PyTuple_New()函数构建参数,然后使用PyList_New()函数构建list参数,如果设置固定大小参数,则使用PyList_SetItem()函数设置list子项;如果不设置大小(参数为0),则使用PyList_Append()函数设置list子项。

图片

  • 列表出参:函数调用方式与之前相同,处理列表返回值则略有差别。首先,要使用PyList_Check()函数判断返回值是否为list,然后调用PyList_Size()函数获取list大小,最后使用PyList_GetItem()函数遍历list子项的值。

图片

字典出入参

  • 字典入参:字典作为入参,和列表有些类似,都是带有多个值,首先还是使用PyTuple_New()函数构建参数,然后使用PyDict_New()函数构建dict参数。接下来,使用PyDict_SetItemString()函数设置字典key和value值。

图片

  • 字典出参:函数调用基本一致,对应字典返回值,首先要使用PyDict_Check()函数判断返回值是否为dict,然后可调用PyDict_Size()函数获取dict的key数目,可以使用PyDict_GetItemString()函数获取dict子项的值。

图片

还可以使用PyDict_Next()函数遍历字典,获取key和value值。

图片

引用计数

Python里一切皆对象,API的核心就是PyObject,其中ob_refcnt就是引用计数。当对象有新的引用时,ob_refcnt就会增加,当引用它的对象被删除,ob_refcnt就会减少。当引用计数为0时,该对象的生命周期就结束了。

其中主要涉及以下API:

  • Py_INCREF()

  • Py_DECREF()

  • Py_XDECREF()

其中Py_XDECREF入参可为空值。

API查找

常见API可以在文档https://docs.python.org/3.10/c-api/stable.html#stable中查询,针对API的引用计数说明,可以参考文档标注,一般有New reference/Borrowed reference,其中New reference使用后需要调用Py_DECREF()函数减少引用计数。

图片

自动处理引用计数

对于需要减少引用计数的变量,可以增加一个类来管理,通过类的析构函数帮助自动减少引用。

图片

图片

编译运行

可以直接在Visual Studio里面增加代码,设置Python头文件和库文件路径来,然后编译运行。此处是直接使用命令行工具编译,打开Visual Studio工具,然后执行如下命令(Python路径根据实际安装路径来设置):

cl /I D:\application\Python\Python310\include main.cpp D:\application\Python\Python310\libs\python310.lib

执行结果如下:

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值