首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyFile_WriteObject写得太晚了

PyFile_WriteObject写得太晚了
EN

Stack Overflow用户
提问于 2018-04-08 14:29:45
回答 1查看 145关注 0票数 0

我或多或少有这样的代码:

代码语言:javascript
复制
PyObject* py_list(PyObject* obj) {
    printf("py_list: %p, ", obj);
    PyObject* pystdout = PySys_GetObject("stdout");
    PyFile_WriteObject(obj, pystdout, Py_PRINT_RAW);
    printf("\n");
    printf("py_list: %p\n", pystdout);
    if (obj == NULL) {
        return PyList_New(0);
    }
    PyObject* result = PyList_New(1);
    PyList_SetItem(result, 0, obj);
    printf("py_list returns: %p, ", result);
    PyFile_WriteObject(result, pystdout, Py_PRINT_RAW);
    printf("\n");
    return result;
}

我真正想要的是复制str(obj) (Python2版本),然后在printf调用中使用结果。我找不到一个正常的API来调用这样的东西。所以,PyFile_WriteObject是我能找到的最接近.但是,它没有写到stdout,而是等到与stdout的每一个可能的交互都用C语言完成,然后它才打印它应该打印的任何东西.

我看过Cython为像print(obj)str(obj)这样的代码生成了什么,我想把我的头发拔出来,这太复杂了。我真正需要的就是能够打印出Python对象,以便进行调试。我也尝试过GDB方式,但是Python对象太混乱了,当您从GDB的角度来看它们时,它也是不可行的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-08 14:42:59

然而,PyFile_WriteObject没有写到stdout,而是等待到与stdout的每一个可能的交互

您可能会被Python级别的缓冲所咬伤。打电话给PyObject_CallMethod(pystdout, "flush", "")可能会解决这个问题。

我真正想要的是复制str(obj) (Python2版本),然后在printf调用中使用结果。

您要寻找的API是PyObject_StrPyUnicode_AsUTF8相结合的。这就允许这样的事情:

代码语言:javascript
复制
printf("py_list returns: %s\n", PyUnicode_AsUTF8(PyObject_Str(result)));

这将泄漏__str__返回的字符串,并在PyObject_Str引发时崩溃;正确的版本可能如下所示:

代码语言:javascript
复制
void print_obj(PyObject *o) {
    PyObject *o_str = PyObject_Str(o);
    if (!o_str) {
        PyErr_Print();
        return;
    }
    printf("%s\n", PyUnicode_AsUTF8(o_str));
    Py_DECREF(o_str);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49718945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档