Куда идет мой встроенный стандартный вывод Python?

Рассмотрим следующее 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, как ожидалось?

2 ответа

Решение

Когда 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;
}

В текущем Python вы можете использовать Py_UnbufferedStdioFlag.

Другие вопросы по тегам