我尝试记录用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
}
答案 0 :(得分:2)
我认为这可能与不同的C运行时有关。我知道你不能在不同的C运行时间之间传递文件描述符 - Python是用MSVC构建的(你需要检查哪个版本) - 所以你可以尝试使用相同的C运行时进行MinGW构建 - 我认为有选项可以做这在MinGW中与-lmsvcrt80(或任何适当的版本)相同,但出于许可原因,他们无法分发库,因此您必须在系统中找到它们。对不起,我暂时还没有更多相关细节,但希望它是谷歌搜索的开始。
更简单的方法是在Python中完成所有操作...只需创建一个公开write
和flush
方法的类,并将其分配给sys.stdout。例如,对于一个文件,您只需传递一个打开的文件对象 - 它可能会直接为您的管道执行类似的操作。然后只需导入它和sys并在PyRun_SimpleString中设置sys.stdout。