擅长:python、mysql、java
<p>将这两个答案-<a href="https://stackoverflow.com/a/5103455/1820106">https://stackoverflow.com/a/5103455/1820106</a>&;<a href="https://stackoverflow.com/a/4178672/1820106">https://stackoverflow.com/a/4178672/1820106</a>组合到上下文管理器,该上下文管理器只为其作用域阻止打印到stdout(第一个答案中的代码阻止了任何外部输出,后一个答案在结尾错过了sys.stdout.flush()):</p>
<pre><code>class HideOutput(object):
'''
A context manager that block stdout for its scope, usage:
with HideOutput():
os.system('ls -l')
'''
def __init__(self, *args, **kw):
sys.stdout.flush()
self._origstdout = sys.stdout
self._oldstdout_fno = os.dup(sys.stdout.fileno())
self._devnull = os.open(os.devnull, os.O_WRONLY)
def __enter__(self):
self._newstdout = os.dup(1)
os.dup2(self._devnull, 1)
os.close(self._devnull)
sys.stdout = os.fdopen(self._newstdout, 'w')
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout = self._origstdout
sys.stdout.flush()
os.dup2(self._oldstdout_fno, 1)
</code></pre>