考虑以下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,如预期的那样?
答案 0 :(得分:3)
当stdout
引用终端时,输出是行缓冲的,否则是块缓冲或完全缓冲,在块填满之前不会输出。
要在stdout
引用非终端时缓冲输出线,请将模式设置为setvbuf
您必须致电Py_Finalize()
让libpython
关闭其I / O句柄。
#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;
}
答案 1 :(得分:1)
在当前的 Python 中,您可以使用 Py_UnbufferedStdioFlag
。