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 등 파이썬 타입에 대응하는 펑션들이 있습니다.

    마지막으로 레퍼런스 카운트를 잘 처리해야 합니다. 처리가 잘못되면 메모리가 새거나 프로세스가 죽습니다.

    이 부분은 공식문서를 참고하세요.

    • 아 그리고 이것 저것 찾아보면 PyString_AsString 함수가 많이 나오는데.;; 파이썬 3버전 가서 변경되었는지는 모르겠는데 PyString_AsString이 없더라구요;; 지금은 Bytes를 이용해서 출력은 하긴 합니다 ㅎ;; 반시 2020.4.21 17:12

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)