我的嵌入式python stdout在哪里?

时间:2015-06-30 09:13:08

标签: python python-3.4 python-embedding

考虑以下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 个答案:

答案 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