1

python python-wrapped C++ を呼び出すときに出力をリダイレクトするラッパーがあります。

基本的な考え方は、C++ からの出力をキャッチできた唯一の方法であるdupandを使用することです。ジョブをインタラクティブに実行している限り、ラッパーは呼び出しなしで正常に動作しますが、ジョブを TORQUE バッチに送信すると、歓迎されない出力が再び得られます。dup2printfflush()

私の理解は、この質問の一部から、適切に配置されたflush()呼び出しでこれを修正する必要があるということですが、正確にはどこに行く必要があるのでしょうか? 一時ファイルに複製する前にバッファをフラッシュする必要がありますか? 戻る前に?両方?


私が使用しているラッパーは次のとおりです。

class Filter(object): 
    """
    Workaround filter for annoying and worthless errors. 
    """
    def __init__(self, veto_words={'ClassTable'}): 
        self.veto_words = set(veto_words)
        self.temp = tempfile.NamedTemporaryFile()
    def __enter__(self): 
        sys.stdout.flush() # <--- NEEDED? 
        sys.stderr.flush() # <--- NEEDED? 
        self.old_out, self.old_err = os.dup(1), os.dup(2)
        os.dup2(self.temp.fileno(), 1)
        os.dup2(self.temp.fileno(), 2)
    def __exit__(self, exe_type, exe_val, tb): 
        sys.stdout.flush() # <--- NEEDED? 
        sys.stderr.flush() # <--- NEEDED? 
        os.dup2(self.old_out, 1)
        os.dup2(self.old_err, 2)
        self.temp.seek(0)
        for line in self.temp: 
            veto = set(line.split()) & self.veto_words
            if not veto: 
                sys.stderr.write(line)
4

1 に答える 1

2

Python は、TTY に接続されている場合にライン バッファリングを適用します。それ以外の場合は、より大きなバッファが必要になります。

Python プログラムをパイプにリダイレクトすると、ストリームに接続された TTY がないことを意味し、.flush()改行を送信する場合でも使用する必要があります。

Python を で実行し-uて、 のバッファリングをオフにすることができますstdout

于 2013-03-30T15:44:00.830 に答える