雖然將stdout/stderr 重定向到外部檔案是常見的做法,但可能有必要在範圍內臨時這樣做
現有解決方案通常會替換整個輸出流,而使這些流的本地副本不受影響。當方法使用流的本機副本時,這可能會導致問題。
為了解決此限制,我們可以使用 contextmanager 實現重定向邏輯:
<code class="python">import os import sys class RedirectStdStreams(object): def __init__(self, stdout=None, stderr=None): self._stdout = stdout or sys.stdout self._stderr = stderr or sys.stderr def __enter__(self): self.old_stdout, self.old_stderr = sys.stdout, sys.stderr self.old_stdout.flush(); self.old_stderr.flush() sys.stdout, sys.stderr = self._stdout, self._stderr def __exit__(self, exc_type, exc_value, traceback): self._stdout.flush(); self._stderr.flush() sys.stdout = self.old_stdout sys.stderr = self.old_stderr</code>
此類允許臨時重定向 stdout 和 stderr。
為了示範用法,我們可以將輸出重定向到/dev/null 並觀察行為:
<code class="python">if __name__ == '__main__': devnull = open(os.devnull, 'w') print('Fubar') with RedirectStdStreams(stdout=devnull, stderr=devnull): print("You'll never see me") print("I'm back!")</code>
在此範例中,訊息「You 'll never see me」在重定向處於活動狀態時被抑制,但隨後可見,確認重定向是臨時的並且僅影響上下文管理器內的範圍。
以上是如何使用上下文管理器暫時重定向 Python 中的 stdout/stderr?的詳細內容。更多資訊請關注PHP中文網其他相關文章!