python嵌入要点(c/c++版)

python嵌入即在非python语言中使用python语言,这与python扩展正好相反。

扩展与嵌入的对象均是python语言:
嵌入即嵌入python,在其他语言中嵌入python,在其他语言中调用python;
扩展即扩展python,使用其他语言扩展python,在python中使用其他语言。

python嵌入一般流程如下:
先把一些数据从c的表示形式转化成python的表示形式。
然后调用python的API。
最后,把python的调用结果转化成c的表示形式。

转换c数据到python数据:
PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...)

PyObject* PyFloat_FromDouble(double v)
PyObject* PyInt_FromLong(long ival)
PyAPI_FUNC(PyObject *) PyString_FromString(const char *)

转换python数据到c数据:
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...)
PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, const char *,  char **, ...)
PyArg_Parse(不推荐使用)

PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *pyfloat)
PyAPI_FUNC(long) PyInt_AsLong(PyObject *)
PyAPI_FUNC(char *) PyString_AsString(PyObject *)

调用python:
首先必不可少的要import:
PyAPI_FUNC(PyObject *) PyImport_ImportModule(const char *name)

调用函数:
PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *method, char *format, ...):
o.method(arg)

PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, char *format, ...):
callable_object(arg)

PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable_object, PyObject *args)

PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw):
args不能为NULL(PyObject_CallObject不受此限),此时()即空tuple可以接受。

其他函数:
Py_Initialize()、Py_Finalize
int PyRun_SimpleString(const char *cmd)
PyObject *PyModule_GetDict(PyObject *module) [相当于模块的__dict__属性]
PyObject *PyObject_GetAttrString(PyObject *obj, char *attr) [获取对象obj的attr属性或者函数]

引用计数:
部分返回borrowed reference的函数:
PyImport_GetModuleDict、PyModule_GetDict、
PyList_GetItem、PyList_GET_ITEM、PyTuple_GetItem、PyTuple_GET_ITEM
PyDict_GetItem、PyDict_GetItemString

部分steal reference的函数:
PyTuple_SetItem、PyTuple_SET_ITEM、PyList_SetItem、PyList_SET_ITEM