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 (20120426 でダウンロードされたバージョン) で C++ ライブラリと Swig/Python バインディングをコンパイルしています。使用しているツールのバージョンは Python (2.7.3)、Swig (2.0.8) です。 ) および gcc (4.6.2)。

4

0 に答える 0