gpt4 book ai didi

c++ - Python 和动态扩展 C++ 类

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:55 26 4
gpt4 key购买 nike

所以我在 Python 中遇到了自定义类型、函数和属性的问题。

当我在 Python 中时,我想在我的自定义类型之一(例如 Vector4)上设置一个属性,我的代码为 const char* attribute_name 参数(和是的,我正在导入我的模块)。

奇怪的是,当我在 setter 函数中对属性名称进行硬编码时,出现错误:

SystemError: 未设置异常的错误返回

我确实看到对象是在 Python 中创建的(又是在 C++ 中创建的),所以我认为这不是问题所在。如果 setattro Hook 在 C++ 中成功设置了属性,我会返回 1,并且我看到代码被调用并在 C++ 端设置了属性。设置属性时不会引发任何错误/异常。

此外,当我在 Python 中调用类实例上的函数时,它会调用 tp_getattro 中设置的函数,而不是检查字典。

我不完全确定为什么,也许是因为我正在设置一个字典并将我的函数放在那里,而不是通过 PyModuleDef 数组来完成,因此看不到函数当调用 PyType_Ready 时。

有谁知道为什么会发生这种情况?我们使用的是 Python 3.2。


相关:

我有一个基类型(tp_newtp_dealloc),然后我在运行时创建派生类型。派生类型有字典、tp_basetp_getattrotp_setattro

这是将函数绑定(bind)到 Python 类/类型的方式:

PyMethodDef newMethod;
newMethod.ml_doc = newMethod.ml_name = funcName;
newMethod.ml_flags = METH_VARARGS;
newMethod.ml_meth = pythonFunc;

PyGeneralObj* selfFake = PyObject_New(PyGeneralObj, &MetaEngineType);
selfFake->className = className;
selfFake->funcName = funcName;
Py_INCREF((PyObject*)selfFake);

PyObject *func = PyCFunction_New(&newMethod, (PyObject*)selfFake);
PyObject *method = PyInstanceMethod_New(func);

ErrorIf((method == NULL), "Python: Cannot create instance function. %s",
funcName);

ErrorIf((PyDict_SetItem(classObj->m_pyClassType->tp_dict,
PyReturnStr(newMethod.ml_name), method) == -1),
"Python: Cannot create function in dictionary.");

Py_DECREF(func);
Py_DECREF(method);

其中 funcName 和 className 是 const char*。 pythonFunc 是一个通用的 python 函数,它处理调用所有绑定(bind)到我们的元系统的函数。 classObj 是指向具有成员 m_pyClassType(PyTypeObject 的类型)的 PythonClass 的指针。

PyGeneralObj 是一个新对象,有两个 const char* 和一个 void*(这是 C++ 中的对象)

我执行 PyType_Ready 并且没有出现任何错误,然后增加我的类型。然后我将该对象添加到我从 PyImport_ImportModule 获得的模块 PyObject 中。我将我的主模块附加到运行时并初始化 python 并导入我的模块。


如果需要更多信息/代码,我可以发布更多。我希望这是有道理的,这是我第一次在 stackoverflow 上发帖。

为澄清起见,我们希望拥有在 C++ 端完全解析的动态属性。对于函数,我希望能够覆盖 PyObject* self 参数,以便我可以获得需要调用的函数的字符串名称。

我们不想使用第三方库/接口(interface),例如 Boost、Cython 等。

最佳答案

问题出在我对 getattro 的实现上。

关于c++ - Python 和动态扩展 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7759827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com