2011-03-18 1 views
27

나는 C 파이썬 확장을 가지고 있는데, 나는 진단을 출력하고 싶다.Python : PyObject의 문자열 표현을 가져 옵니까?

문자열을 PyObject *로 받고 있습니다.

const char *로 사용할 수 있도록이 객체의 문자열 rep를 얻는 표준 방법은 무엇입니까?

업데이트 :은 const char *로 액세스를 강조합니다.

답변

36

사용 PyObject_Reprconst char*로 사용, 당신이 할 수있는, 일반적으로해야 (char *를 얻을 수 PyString_AsString를 호출 한 후 (str을 모방하기 위해) 또는 PyObject_Str (파이썬의 repr 기능을 모방하는), 그리고, 예를 들면 :

PyObject* objectsRepresentation = PyObject_Repr(yourObject); 
const char* s = PyString_AsString(objectsRepresentation); 

이 방법은 어떤 PyObject에 대한 확인 당신이 yourObject이 Pyth 절대적으로 확신합니다. 문자열이 아닌 뭔가 다른, 같은 예를 들어 숫자, 당신은 첫 번째 줄을 건너 뛰고 수행 할 수 있습니다

static void reprint(PyObject *obj) { 
    PyObject* repr = PyObject_Repr(obj); 
    PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "~E~"); 
    const char *bytes = PyBytes_AS_STRING(str); 

    printf("REPR: %s\n", bytes); 

    Py_XDECREF(repr); 
    Py_XDECREF(str); 
} 
+2

Python 3 용 PyBytes_AsString (yourObject)을 사용하려고하고 TypeError가 발생했습니다. 예상 바이트, str을 찾았습니다. –

+0

PyBytes_AsString을 제 답변에 언급하지 않았습니다. 내 대답에서 제안한 것을 시도 했습니까? – piokuc

+7

Py3.x에서 PyString이 PyBytes로 대체되었지만 동일한 기능을 사용하지는 않았습니다. 결국 : PyUnicode_AsUTF8 (objectsRepresentation) –

5

PyObject_Repr가 또는 PyObject_Str (파이썬의 str을 모방) (파이썬의 repr가 모방)보십시오.

문서 :

Compute a string representation of object o. Returns the string representation on success, NULL on failure. This is the equivalent of the Python expression repr(o). Called by the repr() built-in function.

+0

이 외모 : 여기

const char* s = PyString_AsString(yourObject); 

+0

PyBytes_AS_STRING, PyUnicode_AS_STRING, ... –

3

는 파이썬 3를 사용하는 경우 정답이다 내가 필요로하는 것처럼 ... 일단이 함수 중 하나에 의해 반환 된 PyObject를 얻었 으면 어떻게 C에 친숙한 방식으로 액세스 할 수 있습니까? printf를 호출하는 등)