首页 / 操作系统 / Linux / 将PJSIP的Python扩展从Python 2.4升级到Python 3.2
Pjsip 1.8.5中python部分是基于python2.4的,这个有点跟不上时代了。我的python环境是python3.2的。修改步骤:一 替换_pjsua.h和_pjsua.c中的函数
原来pjsip工程中python_pjsua的代码中大量试用了python2.*中stringobject.*的函数。这个string在python3以后已经完全被unicode string取代了,stringobject.h也被去掉了。所以需要将原有对python sting 的调用都替换为python Unicode string。Intobject也被longobject取代。intobject -> longobjectstringobject -> unicodeobject1. PyString_Size –> PyUnicode_GetSize2. PyString_AsString -> PyUnicode_AsString3. PyInt_AsLong -> PyLong_AsLong4. PyString_Check -> PyUnicode_Check5. PyString_AsString -> _PyUnicode_AsString去掉ob_type相关行。二 修改_pjsua.c文件中init_pjsua函数
1. 将原有:/** Mapping C structs from and to Python objects & initializing object*/DL_EXPORT(void)init_pjsua(void){PyObject* m = NULL;替换为:/** Mapping C structs from and to Python objects & initializing object*///DL_EXPORT(void)PyMODINIT_FUNCPyInit__pjsua(void){PyObject* m;2. 将原有的module初始化方式从:m = Py_InitModule3("_pjsua", py_pjsua_methods, "PJSUA-lib module for python");替换为:m = PyModule_Create(&_pjsuamodule);if (!m)return NULL;并要声明一个新的PyModuleDef结构_pjsuamodulestatic const char module_docs[] ="Create and manipulate C compatible data types in Python.";static struct PyModuleDef _pjsuamodule = {PyModuleDef_HEAD_INIT,"_pjsua",module_docs,-1,py_pjsua_methods,NULL,NULL,NULL,NULL};3. 增加返回值PyMODINIT_FUNC有返回值return m;异常时返回NULL4. 修改PyTypeObject 的类型也不同:PyObject_HEAD_INIT将类似static PyTypeObject PyTyp_pjsip_cred_info ={PyObject_HEAD_INIT(NULL)0,。。。全部替换为static PyTypeObject PyTyp_pjsip_cred_info ={PyVarObject_HEAD_INIT(NULL, 0)三 修改setup-vc.py
将其中print相关修改参考下面代码:Old: print "The answer is", 2*2New: print("The answer is", 2*2)Old: print x, # Trailing comma suppresses newlineNew: print(x, end=" ") # Appends a space instead of a newlineOld: print # Prints a newlineNew: print() # You must call the function!Old: print >>sys.stderr, "fatal error"New: print("fatal error", file=sys.stderr)Old: print (x, y) # prints repr((x, y))New: print((x, y)) # Not the same as print(x, y)!四 修改pjsua.py
上面的修改主要针对生成的_pjsua模块,实际上pjsip在python中注册了两个模块(_pjsua和pjsua),pjsua.py就是基于_pjsua的进一步封装的库,这个文件也需要修改。1 将import thread去掉# thread.start_new(_worker_thread_main, (0,))threading.Thread(target=_worker_thread_main, args=(0,))2 修改Error类声明:class Error(BaseException):五 生成python库文件
执行setup-vc.py:Python setup-vc.py install在python中测试:>>>import _pjsua>>>import pjsua