扩展以C对象作为参数的Python函数

时间:2018-01-11 07:58:58

标签: python c parsing

我有一个以对象作为参数的C函数:

void fct(struct Objet * obj1) {
  ....
}

我想在Python中使用这个函数。我试图解析这个论点,但找不到方法。在Python中:

static PyObject* NameMod_fct(PyObject* self, PyObject* args) {

    PyObject * Obj;

    if (!PyArg_ParseTuple(args, "O!", **&...**, &Obj)) { // what should I put as &Py_Type?
        return NULL;
    }

...
} 

1 个答案:

答案 0 :(得分:1)

每个Python对象都有一个对其类型的引用:对于pPyObj(类型为PyObject*),可以使用pPyObj->ob_type访问它。

这应该指向PyTypeObject的实例。

此时,答案很大程度上取决于resp的位置。 PyTypeObject是"构建"。

案例A:Objet是一个用C

编写的包装器对象

就是这种情况,我感到有宾至如归的感觉。 (因为我完全通过在C / C ++中编写扩展来获得我对Python的了解)。应该/必须存在static PyTypeObject实例,它最初在Python中注册。只需获取并传递其地址。

案例B:Objet是非C库的对象

嗯......那个恕我直言是最困难的案例。您必须检索resp的地址。 PyTypeObject个实例。这可能可以通过检索resp来完成。 Python的词典。由于我没有这方面的经验,所以我不能详细说明。

我想一个好的开始就是(重新)搜索PyModule_GetDict()PyImport_Import()

案例C:Objet是内置类型Python的对象

最后但并非最不重要 - 这是一个微不足道的案例。在这种情况下,我不会使用O,因为内置类型还有很多其他指示符。