標準ストリームを使用してオブジェクトを読み書きする 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)。