2017-02-26 10 views
3

このブロックはelsewhere on stackoverflowです。私はかなりそれを使用してきましたが、何回何回enablePrint()を実行しても、何らかのアイデアがあっても、何らかの印刷機能が動作するようには見えませんでしたか?Python +は印刷出力を無効にしました。返すことができません

# Disable 
def blockPrint(): 
    sys.stdout = open(os.devnull, 'w') 

# Restore 
def enablePrint(): 
    sys.stdout = sys.__stdout__ 

と出力( 'test')の結果は出力されません。私はJuptyerでこれをやっています。

答えて

1

あなたはそれを復元できるように、古い標準入力を保存する必要があります。

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>' 
+0

import os, sys class HiddenPrints: def __enter__(self): self._original_stdout = sys.stdout sys.stdout = open(os.devnull, 'w') def __exit__(self, exc_type, exc_val, exc_tb): sys.stdout = self._original_stdout 

を次に、あなたがこのようにそれを使用することができますありがとう。コンテキストマネージャを使う理由はまだ分かりません。 (私は2.7を使っています) – keynesiancross

+0

一時的に 'resource'を使いたいのであれば、コンテキストマネージャはそのリソースが*解放されたことを確認できます。私は 'with'文が意図をより明確にしていると感じています(また、コードのどの部分が影響を受けるべきか)。しかし、明らかにそれを使用する必要はありません。 –

0

声明WITHと仕事をするために(コンテキストマネージャ)あなたはちょうど2つのメソッドを実装する必要があります。

with HiddenPrints(): 
    print("This will not be printed") 

print("This will be printed as before") 
関連する問題