【问题标题】:Python C API: How to store any Python Object as a void* without knowing its type?Python C API:如何在不知道其类型的情况下将任何 Python 对象存储为 void*?
【发布时间】: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


【解决方案1】:

找到了我的问题:
我在 C 中存储了一个 python 对象,但没有增加它的引用计数器(使用 Py_INCREF(PyObject *o))。显然,python 释放了导致奇怪行为的 python 对象。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多