我有一个C python扩展,我想打印一些诊断。
我收到一个字符串作为PyObject *。
获取此对象的字符串rep的规范方法是什么,这样它可以用作const char *?
更新:澄清,强调访问为const char *。
答案 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);
是的,这是一个非常量指针,您可以通过它潜在地修改(不可变)字符串。