以下为授权转载的一盎司科技公众号文章
鉴于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
执行结果如下: