3 回答

TA貢獻1802條經(jīng)驗 獲得超5個贊
只是為了補充別人已經(jīng)說過的內(nèi)容,Python 3.4引入了contextlib.redirect_stdout上下文管理器。它接受將輸出重定向到的文件(類)對象。
重定向到/ dev / null將抑制輸出:
In [11]: def f(): print('noise')
In [12]: import os, contextlib
In [13]: with open(os.devnull, 'w') as devnull:
....: with contextlib.redirect_stdout(devnull):
....: f()
....:
In [14]:
此解決方案可以用作裝飾器:
import os, contextlib
def supress_stdout(func):
def wrapper(*a, **ka):
with open(os.devnull, 'w') as devnull:
with contextlib.redirect_stdout(devnull):
func(*a, **ka)
return wrapper
@supress_stdout
def f():
print('noise')
f() # nothing is printed
在Python 2和3中都可以使用的另一種可能且偶爾有用的解決方案是將/ dev / null作為參數(shù)傳遞給f并使用函數(shù)的file參數(shù)重定向輸出print:
In [14]: def f(target): print('noise', file=target)
In [15]: with open(os.devnull, 'w') as devnull:
....: f(target=devnull)
....:
In [16]:
您甚至可以target完全選擇:
def f(target=sys.stdout):
# Here goes the function definition
請注意,您需要
from __future__ import print_function
在Python 2中

TA貢獻2039條經(jīng)驗 獲得超8個贊
您為什么認為這效率低下?你測試了嗎?順便說一句,它根本不起作用,因為您正在使用該from ... import語句。sys.stdout可以很好地進行替換,但是不要進行復(fù)制,也不要使用臨時文件。而是打開空設(shè)備:
import sys
import os
def foo():
print "abc"
old_stdout = sys.stdout
sys.stdout = open(os.devnull, "w")
try:
foo()
finally:
sys.stdout.close()
sys.stdout = old_stdout

TA貢獻1877條經(jīng)驗 獲得超6個贊
stdout假設(shè)foo包含print語句,在執(zhí)行操作時分配變量不會產(chǎn)生任何影響-另一個示例,說明為什么您永遠不應(yīng)該從模塊內(nèi)部導(dǎo)入內(nèi)容(如此處所做的操作),而始終從模塊內(nèi)部整體導(dǎo)入(然后使用限定名稱)。copy順便說一句,這無關(guān)緊要。您的摘要的正確等效項是:
import sys
save_stdout = sys.stdout
sys.stdout = open('trash', 'w')
foo()
sys.stdout = save_stdout
現(xiàn)在,當(dāng)代碼正確時,是使它更優(yōu)雅或更快速的時候了。例如,您可以使用內(nèi)存中類似文件的對象代替文件“ trash”:
import sys
import io
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
foo()
sys.stdout = save_stdout
為了優(yōu)雅起見,上下文是最佳的,例如:
import contextlib
import io
import sys
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
yield
sys.stdout = save_stdout
一旦定義了此上下文,對于不需要標準輸出的任何塊,
with nostdout():
foo()
更多優(yōu)化:您只需要使用具有no-op write方法的對象替換sys.stdout 。例如:
import contextlib
import sys
class DummyFile(object):
def write(self, x): pass
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = DummyFile()
yield
sys.stdout = save_stdout
與之前的實現(xiàn)方式相同nostdout。我認為它不會比這更干凈或更快速;-)。
添加回答
舉報