Python:获取PyObject的字符串表示形式?

时间:2011-03-18 19:15:29

标签: python string pyobject

我有一个C python扩展,我想打印一些诊断。

我收到一个字符串作为PyObject *。

获取此对象的字符串rep的规范方法是什么,这样它可以用作const char *?

更新:澄清,强调访问为const char *。

6 个答案:

答案 0 :(得分:41)

使用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);

答案 1 :(得分:18)

如果您使用的是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);
}

答案 2 :(得分:5)

尝试PyObject_Repr(模仿Python的repr)或PyObject_Str(模仿Python的str)。

文档:

  

计算字符串表示形式   对象o。返回字符串   表示成功,NULL   失败。这相当于   Python表达式repr(o)。叫做   repr()内置函数。

答案 3 :(得分:2)

如果只需要在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);
}

答案 4 :(得分:1)

PyObject *模块名称; PyUnicode_AsUTF8(模块名称)

答案 5 :(得分:1)

对于 python >=3.3:

char* str = PyUnicode_1BYTE_DATA(py_object);

是的,这是一个非常量指针,您可以通过它潜在地修改(不可变)字符串。