//wrap.cpp //1.C代码 #include "Python.h" int add(int arg1, int arg2) { return arg1 + arg2; } //2.add的包装函数: static PyObject* wrap_add(PyObject *self, PyObject *args) { //把输入的Python对象转换为C/C++能识别的数据 int arg1, arg2; if(!PyArg_ParseTuple(args, "ii", &arg1, &arg2)) return NULL; //调用C/C++函数,得到结果 int result = add(arg1,arg2); //把得到的结果包装成Python对象,并返回 return (PyObject*)Py_BuildValue("i", result); } //3.为模块添加PyMethodDef方法数组 static PyMethodDef wrap_methods[] ={ {"add", wrap_add, METH_VARARGS}, {NULL, NULL} }; //4.增加模块初始化函数InitModule PyMODINIT_FUNC initwrap (void) { Py_InitModule("wrap ", wrap_methods); } |
// Example.cpp class Numbers { public: Numbers(int first, double second) : m_first( first), m_second(second){} double NumMemberMult(void){ return m_first*m_second;} private: int m_first; double m_second; }; static void PyDelNumbers(void *ptr) { Numbers * oldnum = static_cast<Numbers *>(ptr); delete oldnum; return; } PyObject *Example_new_Numbers(PyObject *, PyObject* args) { int arg1; double arg2; int ok = PyArg_ParseTuple(args,"id",&arg1,&arg2); if(!ok) return NULL; //动态创建一个新对象 Numbers *newnum = new Numbers(arg1, arg2); //把指针newnum包装成PyCObject对象并返回给解释器 return PyCObject_FromVoidPtr( newnum, PyDelNumbers); } PyObject * Example_Numbers_MemberMult(PyObject *, PyObject* args) { PyObject *pynum = 0; int ok = PyArg_ParseTuple( args, "O", &pynum); if(!ok) return NULL; //把PyCObject转换为void指针 void * temp = PyCObject_AsVoidPtr(pynum); //把void指针转换为一个Numbers对象指针 Numbers * thisnum = static_cast<Numbers *>(temp); //调用函数 double result = thisnum->NumMemberMult(); //返回结果 return Py_BuildValue("d",result); } static PyMethodDef Example_methods[] = { {"Numbers", Example_new_Numbers, METH_VARARGS}, {"NumMemberMult", Example_Numbers_MemberMult, METH_VARARGS}, {NULL, NULL} }; PyMODINIT_FUNC initExample (void) { Py_InitModule("Example", Example_methods); } |
#example.py from Example import * class example(object): def __init__(self,arg1,arg2): self._base = Numbers(arg1,arg2) def MemberMult(self): return NumMemberMult(self._base) |
static PyObject* Windy_dict(PyObject *self, PyObject *args) { //创建列表 PyObject *newlist = PyList_New(0); PyList_Append(newlist, PyString_FromString("first")); PyList_Append(newlist, PyString_FromString("second")); PyList_Append(newlist, PyString_FromString("third")); //返回给解释器 return newlist; } |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |