【发布时间】:2021-10-17 16:01:42
【问题描述】:
我想知道是否可以将任何 Python 对象存储为 Python C API 中的 void*,稍后将按原样返回给 python。
我试图做这样的事情:
store_python_object(PyObject *self, PyObject *args)
{
int retval;
PyObject *self_capsule;
void *stored_object;
/* Parse input arguments */
retval = PyArg_ParseTuple(args,
"OO:store_python_object",
&self_capsule,
&stored_object);
if (!retval) {
return NULL;
}
// More code here...
// Return stored_object to python as-is
}
但是,例如,在存储 int 时,这似乎有一个奇怪的行为(同样,我想存储任何 Python 对象,而不仅仅是 int)。
【问题讨论】:
-
你能解释一下你所说的“奇怪的行为”是什么意思吗?是分段错误还是什么?
-
等等,你想做什么?你不能使用正确的指针格式然后(如果绝对必要的话)将其转换为
void*? -
嗨@user202729。我正在尝试存储用户(python)给出的对象而不是触摸它(只是存储),然后按原样将其返回给 Python。当 python 传递一个字符串时它运行良好(返回的对象看起来很好),当 Python 传递 f 字符串时,我得到分段错误,当我传递一个 int 时,返回的数字是 (num+2),我认为这表明内存错误。
-
@user202729 “正确的指针格式”是什么意思?我希望能够获取任何 python 对象(int、float、list、自定义类实例),存储它,然后按原样返回。
-
我真的不明白为什么这不起作用。可能您应该从
PyArg_ParseTuple获得PyObject*,然后转换为void*(不是100% 确定C 规则是什么......)。但这确实需要minimal reproducible example -// More code here...中可能隐藏着各种错误
标签: python c python-c-api