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

初始化

在调用Python脚本之前,需要先初始化环境,直接调用Py_Initialize()函数即可,初始化之后可以使用Py_IsInitialized()判断初始化是否正常,其返回值为0则表明初始化异常。

图片

清理资源

完成Python调用后可以调用Py_Finalize()函数清理环境。

图片

加载模块

加载模块其实就是加载Python脚本文件,可以通过PyImport_ImportModule()函数来实现,参数无需设置后缀,如main.py,只设置main即可。根据返回值来判断是否加载成功,返回的PyOject不为空即加载成功。返回值可以用于后续查找,调用函数等操作。

图片

查找函数

模块加载成功后,可以使用PyObject_GetAttrString()函数来查找Python函数,然后判断返回值,也可以增加PyCallable_Check()函数来检查。

图片

函数调用

查找函数成功后,可以使用PyObject_CallObject()函数来执行函数调用。

图片

判断对象类型

执行完函数以后,需要判断返回值的类型,如int,string,list,dict等,这样就可以根据类型来获取具体的值。常见函数包括如下几种:

  • PyBool_Check()

  • PyLong_Check()

  • PyUnicode_Check()

  • PyList_Check()

  • PyDict_Check

获取字符串

判断完类型以后,即可获取对应的返回值,此处为字符串,可以使用PyUnicode_AsUTF8获取字符串的值。如果有中文,需要再做一次UTF8到GBK的转换。

图片

图片

设置函数入参

对于包含入参的函数,需要设置参数,可以通过PyTuple_New()创建入参,并使用PyTuple_SetItem()函数添加参数值,其中常用Py_BuildValue()函数来创建值,值类型整型用i,字符串用s表示。

图片

调用带参数函数

调用方式和前面描述的一致,只是多了一个入参,设置为上面增加的参数即可。

图片

编译运行

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

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

执行结果如下:

图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值