Куда идет мой встроенный стандартный вывод 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
.