PyObject 포인터의 값 꺼내기.
조회수 572회
Py _Initialize();
PyRun_SimpleString("print ('hi')");
PyObject* Module = PyUnicode_FromString((char*)"opc");
PyObject* myModule = PyImport_Import(Module);
PyObject* myFunction = PyObject_GetAttrString(myModule, (char*)"Now_analyzer_state");
PyObject* p = PyObject_CallObject(myFunction, NULL);
C++ 코드의 일부를 떼온 것입니다. (Now_analyzer_state
라는 파이썬 함수는 단순 문자열 출력이 이루어 집니다.)
맨 마지막 줄의 PyObject* p
로 담은 p
는 해당 파이썬 함수의 return값이 들어간 객체일 것 같은데
어떤 방식으로 받아와야 C++에서 사용할 수 있는지 궁금합니다.
포인터라고 생각해서 std::cout <<*p<< std::endl;
이렇게 하면 안 되더군요;
1 답변
-
원형입니다.
typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; struct _typeobject *ob_type; } PyObject;
당연히
PyObject* p
는 파이썬 객체를 가리키는 포인터입니다.예를 들에 p가 파이썬 정수 객체 숫자 1이라고 하면 그 정수값을 가져오는 펑션을 사용해야 합니다.
(int)PyInt_AS_LONG(p); const char* s = PyString_AsString(p); //문자열인 경우
와 같은 식으로 사용합니다. 마찬가지로 list나 tuple 등 파이썬 타입에 대응하는 펑션들이 있습니다.
마지막으로 레퍼런스 카운트를 잘 처리해야 합니다. 처리가 잘못되면 메모리가 새거나 프로세스가 죽습니다.
이 부분은 공식문서를 참고하세요.
댓글 입력