使用C/C++调用Python

C/C++ fireling 11713℃

在开发中,各种语言有各自的优势。比如说,Python适合科学计算,Java适合应用开发,而C/C++效率比较高,适合开发嵌入式系统。在实际中经常会遇到混合编程的情况,往往需要集成多种语言的优势来开发一个大的应用。如果我们想用C/C++调用Python框架,比如说,在C/C++中有一些变量,需要通过Python模块去计算并返回结果,供C继续调用做后续处理,那该如何将它们联系在一起呢?

Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快,因此Python和C能够很好地交互。这篇文章,给大家介绍一下,如何使用C或C++来调用Python程序

首先,需要在C/C++程序中设置编译环境,其实就是设置Python的头文件和库文件目录,这样我们就可以在程序中使用#include <Python.h> 了。

其次,需要初始化Python解释器,Py_Initialize(),与此对应的是,释放Python解释器,Py_Finalize()。在他们之间,你可以对C和Python进行变量转换以及调用Python模块。

接下来就是如何调用了,操作主要还是与Python的几个数据结构对应,比如说list、tuple、dict还有数字与字符串。所有Python元素,module、function、tuple、string等等,实际上都是PyObject。C/C++操纵它们,一律使用PyObject *

创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量,使用PyXXX_SetItem可以设置类型为XXX的变量,使用PyXXX_GetItem可以获取类型为XXX的变量。

列表操作


PyObject *PyList_New(Py_ssize_t len) 
int PyList_SetItem(PyObject *p, Py_ssize_t index, PyObject *item)         
PyObject *PyList_GetItem(PyObject *p, Py_ssize_t index)
int PyList_Append(PyObject *p, PyObject *item)
int PyList_Sort(PyObject *p)
int PyList_Reverse(PyObject *p)    

元组操作


PyObject *PyTuple_New(Py_ssize_t len)
int PyTuple_SetItem(PyObject *p, Py_ssize_t index, PyObject *item)
PyObject *PyTuple_GetItem(PyObject *p, Py_ssize_t index)
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize)

字典操作


PyObject *PyDict_New()
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
PyObject *PyDict_GetItem(PyObject *p, PyObject *key)
PyObject *PyDict_GetItemString(PyObject *p, const char *key)
int PyDict_DelItem(PyObject *p, PyObject *key)
int PyDict_DelItemString(PyObject *p, char *key)
int PyDict_Next(PyObject *p, Py_ssize_t *index, PyObject **key, PyObject **val)
PyObject *PyDict_Items(PyObject *p)
PyObject *PyDict_Keys(PyObject *p)
PyObject *PyDict_Values(PyObject *p)

以上三种数据结构,都能新建Python对象,让C/C++实现对Python模块的输入。接下来就可以进行模块调用。

模块与函数:


PyObject *pmodule, *pfunc;
pmodule = PyImport_ImportModule(const char *name) //name:要调用的文件名
pfunc = PyObject_GetAttrString(PyObject *pmodule, const char *key) //key:要调用的函数名
PyObject *result = PyObject_CallObject(PyObject *pfunc, PyObject *args) //args:元组形式的参数列表

对于python返回来的结果,需要转换成C/C++支持的类型,就需要进行类型转换,下面列出比较常用的转换。


long int PyInt_AsLong(PyObject *)
PyObject *PyInt_FromLong(long int)
PyObject *PyInt_FromString(char *)
long int PyLong_AsLong(PyObject *)
PyObject *PyLong_FromLong(long int)
PyObject *PyLong_FromString(char *)
char *PyString_AsString(PyObject *)
PyObject *PyString_FromString(char *)
PyObject *PyList_AsTuple(PyObject *)
long int PyArg_ParseTuple(PyObject *, const char *, ...)

通过了解以上几点,就可以实现C/C++与Python的交互了。

 

转载请注明:宁哥的小站 » 使用C/C++调用Python

喜欢 (8)