【问题标题】:Python, C: redirected stdout fires [Errno 9]Python,C:重定向标准输出触发 [Errno 9]
【发布时间】:2009-11-17 15:44:29
【问题描述】:

我尝试记录用 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
}

【问题讨论】:

  • 您是自己构建 Python 还是尝试使用预构建的二进制文件?
  • 预构建的,来自 python.org

标签: python c windows stdout


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复!对不起,我不确定我是否完全按照不同的运行时进行操作......我试过了:gcc -o std.exe std.c -Ic:/dev/include/python2.6 -l python26 -l msvcr90但随后它因“应用程序未能正确初始化(0x80000003)”而崩溃。另外,我没有 MSVC - 可以吗?我需要来自 VC2008 的 msvcrt.lib(IIRC 这用于 Python 2.6)?在 MinGW 我有几个 libmsvc*.a...
  • 用 mingw 链接它比这更复杂,但恐怕我没有更多细节。使用与 Python 相同的微软编译器可能是最简单的(我认为是 Visual Studio 2008)。
  • 或者用 MinGW 自己构建 Python - 但也不知道这有多容易。
  • 我想我在某处(Python 错误跟踪器)读到,使用 MinGW 构建 Python 相当困难。不过,感谢您的链接!我读了它们,我相信我必须再读一遍,再读一遍……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 2014-01-20
  • 2011-12-08
相关资源
最近更新 更多