python python-wrapped C++ を呼び出すときに出力をリダイレクトするラッパーがあります。
基本的な考え方は、C++ からの出力をキャッチできた唯一の方法であるdup
andを使用することです。ジョブをインタラクティブに実行している限り、ラッパーは呼び出しなしで正常に動作しますが、ジョブを TORQUE バッチに送信すると、歓迎されない出力が再び得られます。dup2
printf
flush()
私の理解は、この質問の一部から、適切に配置された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)