Где мой встроенный python stdout?

Рассмотрим следующий 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;
}

Когда я компилирую и запускаю это как обычно, я получаю ожидаемый вывод:

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

Но когда я перенаправляю вывод, я ничего не получаю от кода python:

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

Что происходит? И что еще более важно, как я могу получить вывод python, написанный на stdout, как ожидалось?

Ответ 1

Когда stdout относится к терминалу, вывод буферизируется в строке, который является блочным или полностью буферизированным, не будет выводиться до тех пор, пока блок не будет заполнен.

Чтобы строка вывода буферизовалась, когда stdout относится к нетерминалу, установите режим setvbuf
И вы должны позвонить Py_Finalize(), чтобы libpython закрыл свой дескриптор ввода-вывода.

#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;
}