Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:获取PyObject的字符串表示?_Python_String_Pyobject - Fatal编程技术网

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

Python:获取PyObject的字符串表示?,python,string,pyobject,Python,String,Pyobject,我有一个C python扩展,我想打印一些诊断 我正在接收一个字符串作为PyObject* 获取此对象的字符串表示形式的标准方法是什么,这样它就可以用作常量char* 更新:澄清强调访问为常量字符*尝试PyObject\u Repr(模仿Python的Repr)或PyObject\u Str(模仿Python的Str) 文件: 计算的字符串表示形式 对象o。返回字符串 表示成功,表示为空 失败。这相当于 Python表达式repr(o)。叫来 repr()内置函数 使用PyObject\u Re

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

我正在接收一个字符串作为PyObject*

获取此对象的字符串表示形式的标准方法是什么,这样它就可以用作常量char*


更新:澄清强调访问为常量字符*

尝试
PyObject\u Repr
(模仿Python的
Repr
)或
PyObject\u Str
(模仿Python的
Str

文件:

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


使用
PyObject\u Repr
(模仿Python的
Repr
函数)或
PyObject\u Str
(模仿
Str
),然后调用
PyString\u AsString
获取
char*
(您可以,通常应该,将其用作
const char*
,例如:

PyObject* objectsRepresentation = PyObject_Repr(yourObject);
const char* s = PyString_AsString(objectsRepresentation);
此方法适用于任何
PyObject
。如果您完全确定
yourObject
是Python字符串,而不是其他东西,例如数字,则可以跳过第一行,只需执行以下操作:

const char* s = PyString_AsString(yourObject);

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

如果需要在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);
}
PyObject*模块名称; PyUnicode AsUTF8(模块名称)

用于python>=3.3:

char* str = PyUnicode_1BYTE_DATA(py_object);

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

这似乎是我需要的…一旦我得到这些函数之一返回的PyObject,如何以C友好的方式访问它(例如调用printf等)我正在尝试PyBytes\u AsString(yourObject)对于Python 3,我得到了TypeError:expected bytes,str Found我在回答中甚至没有提到PyBytes\u AsString。你试过我在回答中的建议吗?我试过了,在Py3.x中PyString被PyBytes替换,但功能不完全相同。我最终使用了:PyUnicode\u AsUTF8(objectsRepresentation)不要忘记
Py\u DECREF(objectsRepresentation)
因为
PyObject\u Repr()
返回一个新引用!如果我的
PyObject
是纯python字符串,我如何将其转换为
const char*
?请注意
PyObject\u Repr
在字符串周围加上单引号。@Montreal与上面的示例相同,但省略
PyObject\u Repr
。为安全起见,如果(!PyUnicode_CheckExact(obj)){…}验证
PyObject*obj
是否确实是
PyUnicode_类型
“~E~”
是什么意思?@mkrieger1在本例中,这将用字符串
“~E~”替换无效字符/数据。