Python:如何获取PyObject的字符串表示?

60 投票
7 回答
40398 浏览
提问于 2025-04-16 13:59

我有一个C语言写的Python扩展,我想打印一些调试信息。

我收到了一个字符串,它是以PyObject*的形式传递过来的。

请问,获取这个对象的字符串表示的标准方法是什么,这样我就可以把它用作const char *类型了?

7 个回答

13

如果你想在Python 3中打印一个对象,你可以使用下面的其中一个函数:

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

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

如果你在使用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);
}
59

使用 PyObject_Repr(这个是用来模仿 Python 的 repr 函数)或者 PyObject_Str(用来模仿 str 函数),然后再调用 PyString_AsString 来获取 char *(你可以用它,通常也应该用 const char*,比如:

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

这个方法适用于任何 PyObject。如果你非常确定 yourObject 是一个 Python 字符串,而不是其他东西,比如数字,你可以跳过第一行,直接这样做:

const char* s = PyString_AsString(yourObject);

撰写回答