考虑以下内容:
#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?
最佳答案
当stdout
指终端时,输出是线路缓冲的,否则是块或完全缓冲的,在块满之前不会输出。
若要使输出线在stdout
指非终端时缓冲,请将模式设置为setvbuf
您必须调用Py_Finalize()
关闭其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;
}