Python,C:重定向的 stdout 触发 [Errno 9]

发布于 2024-08-11 06:24:38 字数 1160 浏览 3 评论 0原文

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

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

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
}

I try to log all the output of a program written in Python and C. However, printing from Python causes IOError: [Errno 9] Bad file descriptor

Please, does anyone know what the problem is and how to fix it?

PS: It's on Windows XP, Python 2.6 and 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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仙女山的月亮 2024-08-18 06:24:38

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

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

I think it could be to do with different C runtimes. I know you can't pass file descriptors between different C runtimes - Python is built with MSVC (you will need to check which version) - so you could try to make MinGW build against the same C runtime - I think there is options to do this in MinGW like -lmsvcrt80 (or whichever is the appropriate versions) but for licensing reasons they can't distribute the libraries so you will have to find them on your system. Sorry I don't have any more details on that for now, but hopefully its a start for some googling.

A simpler way would be to just do it all in Python... just make a class which exposes a write and perhaps flush method and assign it to sys.stdout. Eg for a file you can just pass an open file object - it's probably straightfoward to do a similar thing for your pipe. Then just import it and sys and set sys.stdout in a PyRun_SimpleString.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文