Asynchronously redirect stdout/stdin from embedded python to c++?

后端 未结 3 1997
忘了有多久
忘了有多久 2021-02-07 10:04

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:

相关标签:
3条回答
  • 2021-02-07 10:26

    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

    0 讨论(0)
  • 2021-02-07 10:30

    If you stick with the approach you outlined, inheriting your class from io.IOBase is probably a good idea.

    0 讨论(0)
  • 2021-02-07 10:38

    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()");
    
    0 讨论(0)
提交回复
热议问题