2011-10-13 12 views
1

파이썬의 커스텀 타입, 함수, 속성에 문제가 있습니다.파이썬과 동적으로 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_newtp_dealloc) 다음 나는 런타임에 파생 된 형식을 생성하고 있습니다. 파생 된 형식은 사전, tp_base, tp_getattrotp_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 등의 타사 라이브러리/인터페이스를 사용하고 싶지 않습니다.

답변

0

getattro를 구현할 때 문제가있었습니다.