Python动态扩展C++类

2024-04-18 07:07:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

奇怪的是,当我在setter函数中硬编码属性名时,我得到了一个错误:

SystemError: error return without exception set

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

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

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

有人知道为什么会这样吗?我们使用的是python3.2。在


相关:

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

函数是如何绑定到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函数,它处理调用绑定到元系统的所有函数。classObj是指向PythonClass的指针,它有一个成员m_pyClassType(PyTypeObject的类型)。在

^ {CD11>}是一个新对象,它有两个conchar *和一个空隙*(这是C++中的对象)

我做PyType_Ready并且没有错误,然后增加我的类型。然后我将这个对象添加到模块PyObject中,这个模块是从^{得到的。我会将主模块附加到运行时,初始化python并导入模块。在


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

为了澄清,我们希望在C++方面有完全解决的动态属性。对于函数,我希望能够重写PyObject* self参数,这样我就可以得到需要调用的函数的字符串名。在

我们不想使用诸如Boost、Cython之类的第三方库/接口。在


Tags: 模块对象函数代码name类型属性错误