//定义python 数据成员 PyMemberDef py_data_member[] = { {"v",T_INT,offsetof(py_data,v.v),READONLY,"v"}, {NULL} PyTypeObject py_data_type_type = { #if defined(NPY_PY3K) PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "py_data", sizeof(py_data), 0, /* tp_itemsize */ 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ #if defined(NPY_PY3K) 0, /* tp_reserved */ #else 0, /* tp_compare */ #endif 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ py_signal_type_member, /* tp_members */ static PyObject *type_getitem(char *ip, PyArrayObject* ap) PyTypeObject* type = (PyTypeObject*)&py_data_type_type; py_data *self = (py_data*)type->tp_alloc(type, 0); self->v = *((data*)ip); return (PyObject *)self; static void type_copyswapn(void*dst, npy_intp dstride, void* src, npy_intp sstride, npy_intp n, int swap, void *NPY_UNUSED(arr)) return; static void data_copyswap(void *dst, void* src, int swap, void* NPY_UNUSED(arr)) if (!src) return; data *sig = (data*)dst; memcpy(sig, src, sizeof(data)); static int type_setitem(PyObject* op, char *ov, PyArrayObject* ap) return 0; static npy_bool type_nonzero(char *ip, PyArrayObject* ap) return (npy_bool)true; //直接拿着返回的数值就可以创建一个numpy 数组了。 在python 层也能返回numpy array 直接进行使用 static int register_numpy_dtype() if (PyType_Ready(&py_data_type_type) < 0) { PyErr_Print(); PyErr_SetString(PyExc_SystemError, "could not initialize py_data_type_type"); return -1; int type_num = 0; static PyArray_ArrFuncs _PyDataType_ArrFuncs; PyArray_InitArrFuncs(&_PySignalType_ArrFuncs); _PyDataType_ArrFuncs.getitem = (PyArray_GetItemFunc *)type_getitem; _PyDataType_ArrFuncs.setitem = (PyArray_SetItemFunc *)type_setitem; _PyDataType_ArrFuncs.copyswap = (PyArray_CopySwapFunc *)data_copyswap; _PyDataType_ArrFuncs.copyswapn = (PyArray_CopySwapNFunc *)type_copyswapn; _PyDataType_ArrFuncs.nonzero = (PyArray_NonzeroFunc *)type_nonzero; PyArray_Descr *data_descr; signal_descr = PyObject_New(PyArray_Descr, &PyArrayDescr_Type); signal_descr->typeobj = &py_data_type_type; signal_descr->kind = 'q'; signal_descr->type = 'j'; signal_descr->byteorder = '='; signal_descr->type_num = 0; signal_descr->elsize = sizeof(data); signal_descr->alignment = 8; signal_descr->subarray = NULL; signal_descr->fields = NULL; signal_descr->names = NULL; signal_descr->f = &_PyDataType_ArrFuncs; Py_INCREF(&py_data_type_type); type_num = PyArray_RegisterDataType(signal_descr); if (type_num < 0) PyErr_SetString(PyExc_SystemError, "could not initialize py_data_type_type"); return -1; return 0;