カテゴリー
Uncategorized

[Python] [C] override stdout&stderr output from C

#include <Python.h>
typedef struct {
PyObject_HEAD
/* Type-specific fields go here. */
} MyStdout;
static PyObject *MyStdout_write(MyStdout* self, PyObject *args)
{
char *data = PyString_AsString(args);
if (data){
printf("%s", data);
}
Py_RETURN_NONE;
}
static PyMethodDef MyStdout_methods[] = {
{"write", (PyCFunction)MyStdout_write, METH_O, ""},
{NULL}  /* Sentinel */
};
static PyTypeObject MyStdoutType = {
PyObject_HEAD_INIT(NULL)
0,                         /*ob_size*/
"MyStdout",                /*tp_name*/
sizeof(MyStdout),          /*tp_basicsize*/
0,                         /*tp_itemsize*/
0,                         /*tp_dealloc*/
0,                         /*tp_print*/
0,                         /*tp_getattr*/
0,                         /*tp_setattr*/
0,                         /*tp_compare*/
0,                         /*tp_repr*/
0,                         /*tp_as_number*/
0,                         /*tp_as_sequence*/
0,                         /*tp_as_mapping*/
0,                         /*tp_hash */
0,                         /*tp_call*/
0,                         /*tp_str*/
0,                         /*tp_getattro*/
0,                         /*tp_setattro*/
0,                         /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT,        /*tp_flags*/
"",                        /* tp_doc */
0,                         /* tp_traverse */
0,                         /* tp_clear */
0,                         /* tp_richcompare */
0,                         /* tp_weaklistoffset */
0,                         /* tp_iter */
0,                         /* tp_iternext */
MyStdout_methods,          /* tp_methods */
};
PyObject *mystdout = NULL;
Py_Initialize();
if (PyType_Ready(&MyStdoutType) < 0){
PyErr_Clear();
goto fail;
}
mystdout = _PyObject_New(&MyStdoutType);
if (PyErr_Occurred() || mystdout == NULL){
PyErr_Clear();
goto fail;
}
PySys_SetObject("stdout", mystdout);
if (PyErr_Occurred()){
PyErr_Clear();
goto fail;
}
PySys_SetObject("stderr", mystdout);
if (PyErr_Occurred()){
PyErr_Clear();
goto fail;
}
Py_XDECREF(mystdout);
fail:
Py_XDECREF(mystdout);

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です