2

我有一个用 C++ 编写的库,它使用标准流来读取和写入对象。我还有一个使用 Swig 生成的 Python 接口,用于访问该库。在 Linux 上一切正常,但在 Windows(在 MinGW 上)似乎不可能通过 Python 接口以二进制模式使用 C++ 标准流。如果流在文本模式下使用,额外的 CR 字符会破坏库。标准流完全封装在 C++ 库中,即我没有通过 Python 接口传递它们。

我尝试了一种适用于使用该库的 C++ 程序的解决方案,即添加行

#include <fcntl.h>
int _CRT_fmode = _O_BINARY;

块内

%{
#define SWIG_FILE_WITH_INIT
...
%}

在 Swig libfoo.i 文件中,但它没有效果。还添加了一个功能

void set_binary_mode() {
  assert(stdin == freopen(0, "rb", stdin));
  assert(stdout == freopen(0, "wb", stdout)); 
}

在 Python 程序的开头调用它似乎什么也没做。同样在 Python 程序的开头执行这些行

sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)

和/或

if sys.platform == "win32":
  import msvcrt
  msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
  msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
  msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)

没有效果。前一个的任何组合也不起作用。

我正在 Windows XP 版本 2002 上编译 MinGW32 上的 C++ 库和 Swig/Python 绑定(在 20120426 上下载的版本)。我使用的工具版本是 Python (2.7.3)、Swig (2.0.8) ) 和 gcc (4.6.2)。

4

0 回答 0