我或多或少有这样的代码:
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的角度来看它们时,它也是不可行的。
发布于 2018-04-08 14:42:59
然而,
PyFile_WriteObject没有写到stdout,而是等待到与stdout的每一个可能的交互
您可能会被Python级别的缓冲所咬伤。打电话给PyObject_CallMethod(pystdout, "flush", "")可能会解决这个问题。
我真正想要的是复制
str(obj)(Python2版本),然后在printf调用中使用结果。
您要寻找的API是PyObject_Str和PyUnicode_AsUTF8相结合的。这就允许这样的事情:
printf("py_list returns: %s\n", PyUnicode_AsUTF8(PyObject_Str(result)));这将泄漏__str__返回的字符串,并在PyObject_Str引发时崩溃;正确的版本可能如下所示:
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);
}https://stackoverflow.com/questions/49718945
复制相似问题