简体   繁体   中英

Python: get string representation of PyObject?

I've got a C python extension, and I would like to print out some diagnostics.

I'm receiving a string as a PyObject*.

What's the canonical way to obtain a string representation of this object, such that it usable as a const char *?

update: clarified to emphasize access as const char *.

Use PyObject_Repr (to mimic Python's repr function) or PyObject_Str (to mimic str ), and then call PyString_AsString to get char * (you can, and usually should, use it as const char* , for example:

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

This method is OK for any PyObject . If you are absolutely sure yourObject is a Python string and not something else, like for instance a number, you can skip the first line and just do:

const char* s = PyString_AsString(yourObject);

Here is the correct answer if you are using 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);
}

If you need just print the object in Python 3 you can use one of these functions:

static void print_str(PyObject *o)
{
    PyObject_Print(o, stdout, Py_PRINT_RAW);
}

static void print_repr(PyObject *o)
{
    PyObject_Print(o, stdout, 0);
}

Try PyObject_Repr (to mimic Python's repr ) or PyObject_Str (to mimic Python's 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.

PyObject *module_name; PyUnicode_AsUTF8(module_name)

For python >=3.3:

char* str = PyUnicode_1BYTE_DATA(py_object);

Yes, this is a non-const pointer, you can potentially modify the (immutable) string via it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM