python扩展与嵌入的入门级FAQ
时间:2007-03-22 来源:lidaibin
以下是我在开发一个应用中集成python脚本引擎的过程中所遇到的一些入门级问题,稍后再整理一些比较完整的关于python扩展与嵌入的日志。
1、如何在宿主应用中注册module?可在Py_Initialize之前调用PyImport_AppendInittab来注册,也可在Py_Initialize之后直接调用注册函数。
2、如何添加宿主应用脚本的路径到python搜索路径?在Py_Initialize之后通过PySys_GetObject("path")得到sys.path,然后再通过PyList_Insert加入宿主应用的脚本路径。
3、 如何调用python模块中的函数?通过PyImport_ImportModule得到module,然后再通过PyModule_GetDict从 module中得到dict,再通过PyDict_GetItemString得到函数对象,最后通过PyObject_CallObject或其它 PyObject_Call系列函数调用,当然调用之前最好用PyCallable_Check检查,另外就是dict、func都属于Borrowed reference,因此不需要Py_DECREF或Py_XDECREF。
4、所有的wrapper函数都应该返回PyObject实 例指针,即使在python中调用的时候并不需要返回值,但仍需要返回Py_None,相当于C/C++中的void,Py_INCREF (Py_None); return Py_None;当然也可以用宏Py_RETURN_NONE来代替。
1、如何在宿主应用中注册module?可在Py_Initialize之前调用PyImport_AppendInittab来注册,也可在Py_Initialize之后直接调用注册函数。
2、如何添加宿主应用脚本的路径到python搜索路径?在Py_Initialize之后通过PySys_GetObject("path")得到sys.path,然后再通过PyList_Insert加入宿主应用的脚本路径。
3、 如何调用python模块中的函数?通过PyImport_ImportModule得到module,然后再通过PyModule_GetDict从 module中得到dict,再通过PyDict_GetItemString得到函数对象,最后通过PyObject_CallObject或其它 PyObject_Call系列函数调用,当然调用之前最好用PyCallable_Check检查,另外就是dict、func都属于Borrowed reference,因此不需要Py_DECREF或Py_XDECREF。
4、所有的wrapper函数都应该返回PyObject实 例指针,即使在python中调用的时候并不需要返回值,但仍需要返回Py_None,相当于C/C++中的void,Py_INCREF (Py_None); return Py_None;当然也可以用宏Py_RETURN_NONE来代替。
相关阅读 更多 +