A. Nilsson
A. Nilsson

Reputation: 549

Where does my embedded python stdout go?

Consider the following MWE:

#include <Python.h>
#include <stdio.h>

int main(void) {
  printf("Test 1\n");
  Py_Initialize();
  printf("Test 2\n");
  PyRun_SimpleString("print('Test 3')");
  printf("Test 4\n");
  return 0;
}

When I compile and run this as normal i get the expected output:

$ ./test
Test 1
Test 2
Test 3
Test 4

But when I redirect the output I get nothing from the python code:

$ ./test | cat
Test 1
Test 2
Test 4

What is happening? And more importantly how do I get my python output written to stdout like expected?

Upvotes: 16

Views: 1384

Answers (2)

Yu Kobayashi
Yu Kobayashi

Reputation: 406

In current Python, you can use Py_UnbufferedStdioFlag.

Upvotes: 5

Nizam Mohamed
Nizam Mohamed

Reputation: 9220

When stdout refers to a terminal, the output is line buffered otherwise which is block or fully buffered, won't output until the block is full.

To make the output line buffered when stdout refers to non-terminal, set the mode with setvbuf
And you have to call Py_Finalize() to have libpython close its I/O handle.

#include <Python.h>
#include <stdio.h>

int
main(int argc, char **argv) {
    //setlinebuf(stdout);
    setvbuf(stdout, NULL, _IOLBF, 0);
    printf("Test 1\n");
    Py_Initialize();
    printf("Test 2\n");
    PyRun_SimpleString("print('Test 3')");
    Py_Finalize();
    printf("Test 4\n");
    return 0;
}

Upvotes: 4

Related Questions