考虑以下内容:

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

08-25 05:56
查看更多