2013-03-30 47 views
1

我有一個包裝重定向輸出,當我調用python python包裝的C++。什麼時候在複製文件描述符時調用flush()?

基本思想是使用dupdup2,這是我能夠從C++中捕獲printf輸出的唯一方法。只要我以交互方式運行作業,包裝器就可以正常工作,並且不會調用flush(),但是當我將作業發送到TORQUE批處理時,我會再次獲得不受歡迎的輸出。

我的理解部分來自this question,一些放置良好的flush()調用應該解決這個問題,但他們到底需要去哪裏?我應該在之前將緩衝區沖洗到臨時文件嗎?在重複之前?都?


我使用的包裝物爲如下:當連接到TTY

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) 

回答

2

的Python適用行緩衝,否則需要較大的緩衝器。

將您的Python程序重定向到管道意味着沒有TTY連接到流,並且即使在發送換行符時也必須使用.flush()

你可以運行Python -u來關閉緩衝stdout

+0

我不明白的是我有多少次調用'flush()'。我鏈接的例子稱它爲_before_ duping,而我希望在設置流_back_之前調用'flush()',因爲我想避免將緩衝區轉儲到原始輸出/錯誤流中。 – Shep