Просто создайте объект модуля (вы делаете это в любом случае, если вы используете C API! -) и сделайте так, чтобы он имел подходящую функцию write
- этот объект модуля будет пригоден в качестве второго аргумента для PySys_SetObject
.
В своем ответе на другой ваш вопрос я указал вам на xxmodule.c
, файл примеров в источниках C Python, который представляет собой модуль с множеством примеров, включая типы и функции различных типов - вы можете работать оттуда даже если (загадочно для меня) вы считаете "сделать новый тип" частью слишком трудным; -).
Редактировать : вот тривиальный рабочий пример (aview.py
):
#include "Python.h"
#include <stdio.h>
static PyObject *
aview_write(PyObject *self, PyObject *args)
{
const char *what;
if (!PyArg_ParseTuple(args, "s", &what))
return NULL;
printf("==%s==", what);
return Py_BuildValue("");
}
static PyMethodDef a_methods[] = {
{"write", aview_write, METH_VARARGS, "Write something."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initaview(void)
{
PyObject *m = Py_InitModule("aview", a_methods);
if (m == NULL) return;
PySys_SetObject("stdout", m);
}
Как только этот aview
модуль установлен правильно:
$ python
Python 2.5.4 (r254:67917, Dec 23 2008, 14:57:27)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import aview
>>> print 'ciao'
==ciao====
==>>>
... любая строка, отправляемая в стандартный вывод, записывается со знаком ==
вокруг нее (и это print
вызывает .write
дважды: с 'ciao'
, а затем снова с новой строкой).