5

sys.stdout は、同じプロセスで実行されている iostreams::cout と同じ物理ストリームを参照していると想定していましたが、そうではないようです。次のコードは、「write」という名前の Python ラッパーを使用して C++ 関数を呼び出し、cout に書き込みます。

from cStringIO import StringIO 
import sys 
orig_stdout = sys.stdout 
sys.stdout = stringout = StringIO() 
write("cout") # wrapped C++ function that writes to cout 
print "-" * 40 
print "stdout" 
sys.stdout = orig_stdout 
print stringout.getvalue() 

すぐにコンソールに "cout" を書き込み、次にセパレータ "---..." を書き込み、最後に stringout.getvalue() の戻り値として文字列 "stdout" を書き込みます。私の意図は、C++ から cout に書き込まれた文字列も stringout でキャプチャすることでした。何が起こっているのか知っている人はいますか?

前もって感謝します。

4

3 に答える 3

9

sys.stdout標準出力に書き込む Python オブジェクトです。これは、実際には標準出力ファイル ハンドルではありません。そのファイルハンドルをラップします。Python ランドで指すオブジェクトを変更しても、C++のハンドルまたはストリーム オブジェクトにsys.stdoutはまったく影響しません。stdoutstd::cout

于 2013-01-17T15:47:49.253 に答える
2

comp.lang.python の助けを借りて、このサイトでいくつか検索した後: cdhowie が指摘したように、標準出力ファイル ハンドルには下位レベルでアクセスする必要があります。実際、そのファイル記述子は sys.stdout.fileno() (1 である必要があります) として取得でき、os.dup および os.dup2 を使用できます。

同様の質問に対するこの回答は非常に役に立ちました。

私が本当に望んでいたのは、ファイルではなく文字列で出力をキャプチャすることでした。ただし、python StringIO クラスにはファイル記述子がなく、実際のファイルの代わりに使用することはできません。そのため、一時ファイルが書き込まれ、その後読み取られるという完全に満足できる回避策を思い付きました。

于 2013-01-20T22:41:26.640 に答える
1

PythonはC++ではなくCで記述されており、にアクセスできないため、同じストリームにすることはできませんstd::cout。fd 1に基づく独自のストリームを使用するstdoutか実装するかはわかりませんが、いずれの場合も、2つのオブジェクト(PythonとC ++)を使用して書き込み間でフラッシュすることをお勧めします。

于 2013-01-17T15:58:39.393 に答える