2011-03-18 16 views
27

Tengo una extensión C python, y me gustaría imprimir algunos diagnósticos.Python: ¿obtener una representación de cadena de PyObject?

Estoy recibiendo una cadena como PyObject *.

Cuál es la forma canónica para obtener un representante de cadena de este objeto, de tal manera que se puede usar como un const char *?

actualización: aclarado para enfatizar el acceso como const char *.

Respuesta

36

Uso PyObject_Repr (para imitar la función de Python repr) o PyObject_Str (para imitar str), y luego llamar a PyString_AsString para obtener char * (se puede, y por lo general debe, utilizarlo como const char*, por ejemplo:

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

Este método está bien para cualquier PyObject Si no está absolutamente seguro de yourObject es una Pyth. en la cadena y no otra cosa, como por ejemplo un número, puede omitir la primera línea y acaba de hacer:

const char* s = PyString_AsString(yourObject); 
+2

Estoy intentando PyBytes_AsString (yourObject) para Python 3 y estoy obteniendo TypeError: bytes esperados, str found –

+0

Ni siquiera mencioné PyBytes_AsString en mi respuesta. ¿Has probado lo que sugerí en mi respuesta? – piokuc

+7

Lo intenté, en Py3.x PyString fue reemplazado por PyBytes pero no con la misma funcionalidad. Terminé usando: PyUnicode_AsUTF8 (objectsRepresentation) –

5

Trate PyObject_Repr (para imitar de Python repr) PyObject_Str o (para imitar pitón de str).

Docs:

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

esto parece como lo que necesito ... Una vez que tengo el PyObject devuelto por una de estas funciones, ¿cómo puedo acceder a eso de una manera amigable con C (ej. llamar a printf, etc.) –

+0

PyBytes_AS_STRING, PyUnicode_AS_STRING, ... –

3

Aquí está la respuesta correcta si está utilizando Python 3:

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); 
} 
Cuestiones relacionadas