I am essentially trying to write a console interface with input and output for an embedded python script. Following the instructions here, I was able to capture stdout:
To process all available input inside Python I'd recommend the fileinput module.
If you want to handle input as line-by-line commands, (such as in an interactive interpreter), you might find the python function raw_input useful.
To redirect stdin using a similar helper class such as the ones you've used above, the function to override is readline, not read. See this link for more info on that (and also raw_input).
Hope this helps, Supertwang
If you stick with the approach you outlined, inheriting your class from io.IOBase is probably a good idea.
Easiest way I found so far to do this is as follows:
PyObject *sys = PyImport_ImportModule("sys");
PyObject* io_stdout = PyFile_FromFile(stdout, "stdout", "a", nullptr);
PyObject_SetAttrString(sys, "stdout", io_stdout);
PyObject* io_stderr = PyFile_FromFile(stderr, "stderr", "a", nullptr);
PyObject_SetAttrString(sys, "stderr", io_stderr);
PyObject* io_stdin = PyFile_FromFile(stdin, "stdin", "r", nullptr);
PyObject_SetAttrString(sys, "stdin", io_stdin);
you can test it with:
# for test
PyRun_SimpleString("print sys.stdin.readline()");