あなたはそれを復元できるように、古い標準入力を保存する必要があります。
import sys
import os
# Disable
def blockPrint():
sys.__stdout__ = sys.stdout
sys.stdout = open(os.devnull, 'w')
# Restore
def enablePrint():
sys.stdout = sys.__stdout__
blockPrint()
print("test")
enablePrint()
print("test")
は一度test
を印刷します。
from contextlib import contextmanager
@contextmanager
def blockPrint():
import sys
old_stdout = sys.stdout
sys.stdout = None
try:
yield
finally:
sys.stdout = old_stdout
with blockPrint():
print("test")
print("test")
再び一度だけtest
を出力します。さらに私はcontextmanagerを使用することをお勧めします。
編集:なぜを不思議に思ったものについては、これはbenecessaryすることができますいくつかの状況下でsys.__stdout__
(https://docs.python.org/3/library/sys.htmlを参照)なしになることはできません - 私にとって、これはWindows上でIDLE内のPython 3.5のシェルでの例の場合です。 python 3では
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import sys
>>> repr(sys.__stdout__)
'None'
>>> repr(sys.stdout)
'<idlelib.PyShell.PseudoOutputFile object at 0x03ACF8B0>'
:
を次に、あなたがこのようにそれを使用することができますありがとう。コンテキストマネージャを使う理由はまだ分かりません。 (私は2.7を使っています) – keynesiancross
一時的に 'resource'を使いたいのであれば、コンテキストマネージャはそのリソースが*解放されたことを確認できます。私は 'with'文が意図をより明確にしていると感じています(また、コードのどの部分が影響を受けるべきか)。しかし、明らかにそれを使用する必要はありません。 –