Python,C:重定向stdout fires [Errno 9]

时间:2009-11-17 15:44:30

标签: python c windows stdout

我尝试记录用Python和C编写的程序的所有输出。但是,从Python打印会导致IOError: [Errno 9] Bad file descriptor

请问,有谁知道问题是什么以及如何解决?

PS:它适用于Windows XP,Python 2.6和MinGW GCC

#include <windows.h>
#include <fcntl.h>
#include "Python.h"

int main()
{
    int fds[2];
    _pipe(fds, 1024, O_BINARY);
    _dup2(fds[1], 1);
    setvbuf(stdout, NULL, _IONBF, 0);

/*  alternative version: */
//  HANDLE hReadPipe, hWritePipe; 
//  int fd;
//  DWORD nr;
//  CreatePipe(&hReadPipe, &hWritePipe, NULL, 0);
//  fd = _open_osfhandle((intptr_t)hWritePipe, _O_BINARY);
//  _dup2(fd, 1);
//  setvbuf(stdout, NULL, _IONBF, 0);

    write(1, "write\n", 6);
    printf("printf\n");
    Py_Initialize();
    PyRun_SimpleString("print 'print'"); // this breaks
    Py_Finalize();

    char buffer[1024];
    fprintf(stderr, "buffer size: %d\n", read(fds[0], buffer, 1024)); // should always be more than 0

/*  alternative version: */
//  CloseHandle(hWritePipe);
//  char buffer[1024];
//  ReadFile(hReadPipe, buffer, 1024, &nr, NULL);
//  fprintf(stderr, "buffer size: %d\n", nr); // should always be more than 0
}

1 个答案:

答案 0 :(得分:2)

我认为这可能与不同的C运行时有关。我知道你不能在不同的C运行时间之间传递文件描述符 - Python是用MSVC构建的(你需要检查哪个版本) - 所以你可以尝试使用相同的C运行时进行MinGW构建 - 我认为有选项可以做这在MinGW中与-lmsvcrt80(或任何适当的版本)相同,但出于许可原因,他们无法分发库,因此您必须在系统中找到它们。对不起,我暂时还没有更多相关细节,但希望它是谷歌搜索的开始。

更简单的方法是在Python中完成所有操作...只需创建一个公开writeflush方法的类,并将其分配给sys.stdout。例如,对于一个文件,您只需传递一个打开的文件对象 - 它可能会直接为您的管道执行类似的操作。然后只需导入它和sys并在PyRun_SimpleString中设置sys.stdout。