我正在创建一个python c扩展,但很难找到我想要做的文档。我基本上想要创建一个指向cstruct的指针,并能够访问该指针。示例代码如下。任何帮助将不胜感激。
typedef struct{
int x;
int y;
} Point;
typedef struct {
PyObject_HEAD
Point* my_point;
} PointObject;
static PyTypeObject PointType = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"point", /*tp_name*/
sizeof(PointObject), /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
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*/
Py_TPFLAGS_DEFAULT, /*tp_flags*/
"point objects", /* tp_doc */
};
static PyObject* set_point(PyObject* self, PyObject* args)
{
PyObject* point;
if (!PyArg_ParseTuple(args, "O", &point))
{
return NULL;
}
//code to access my_point
}
答案 0 :(得分:3)
您的PyArg_ParseTuple
不应使用格式O
,而应使用O!
(请参阅文档):
O! (object) [typeobject, PyObject *]
将Python对象存储在C对象中 指针。这类似于O,但是 需要两个C参数:第一个是 Python类型对象的地址, 第二个是C的地址 变量(PyObject *类型)到 其中存储了对象指针。如果 Python对象没有 必需的类型,引发TypeError。
完成后,您知道在您的函数正文中(PointObject*)point
将是指向PointObject
的正确且有效的指针,因此其->my_point
将是{{ 1}}你寻求。使用简单格式Point*
,您必须自己进行类型检查。
修改:评论中的OP请求来源......:
O