파이썬의 커스텀 타입, 함수, 속성에 문제가 있습니다.파이썬과 동적으로 C++ 클래스 확장하기
저는 파이썬에있을 때 내 사용자 정의 유형 (예 : Vector4) 중 하나에 속성을 설정하려고하는데 내 코드는 const char* attribute_name
인수에 대해 NULL을 가져옵니다 (예, 내 모듈을 가져옵니다).
이상하게도, 나는 하드 코드 내 setter 함수의 속성 이름, 나는 오류를 얻을 때 :
SystemError: error return without exception set
내가 (C++로 다시) 객체 파이썬에서 만들어지고 참조 할, 그래서 그게 문제라고 생각하지 않습니다. setattro 후크가 C++에서 속성을 성공적으로 설정했으면 1을 반환하고 C++ 측에서 속성을 호출하고 코드를 가져 오는 것을 봅니다. 속성을 설정할 때 발생하는 오류/예외는 없습니다.
또한 파이썬에서 클래스의 인스턴스에 함수를 호출 할 때 사전을 검사하는 대신 tp_getattro
에 설정된 함수를 호출합니다.
PyModuleDef
배열을 통해 사전을 설정하는 대신 사전을 설정하고 함수를 입력했기 때문에 어쩌면 그 이유가 확실하지 않습니다. 따라서 PyType_Ready
이 호출 될 때 함수가 표시되지 않습니다.
왜 이런 일이 일어날 지 아는 사람이 있습니까? 우리는 파이썬 3.2를 사용하고 있습니다. 관련
:
나는 기본 유형 (tp_new
및 tp_dealloc
) 다음 나는 런타임에 파생 된 형식을 생성하고 있습니다. 파생 된 형식은 사전, tp_base
, tp_getattro
및 tp_setattro
입니다.
이 함수는 파이썬 클래스/유형에 바인드하는 방법입니다 :
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에와 클래스 이름이 * const를 문자입니다 경우. pythonFunc는 우리의 메타 시스템에 바인딩 된 모든 함수를 호출하는 일반적인 파이썬 함수입니다. classObj는 멤버 m_pyClassType (PyTypeObject 타입)을 가진 PythonClass에 대한 포인터입니다.
PyGeneralObj
새로운 개체가 두 CONST의 char *와 무효 * (이것은 C에서 개체입니다 ++)
내가 PyType_Ready
을하고 오류를 얻을하고 내 타입을 증가 가지고있다. 그런 다음 PyImport_ImportModule
에서 주어진 PyObject 모듈에 객체를 추가합니다. 내 메인 모듈을 런타임에 추가하고 파이썬 초기화 및 모듈 가져 오기를 수행합니다.
자세한 정보/코드가 필요한 경우 좀 더 게시 할 수 있습니다. 이것이 의미가되기를 바란다. 이것은 stackoverflow에 게시하는 나의 처음이다.
명확히하기 위해 C++ 측에서 완전히 해결 된 동적 속성을 원합니다. 함수의 경우, 호출해야하는 함수의 문자열 이름을 얻을 수 있도록 PyObject* self
인수를 재정의 할 수 있기를 원합니다.
Boost, Cython 등의 타사 라이브러리/인터페이스를 사용하고 싶지 않습니다.