我有一个由足够多的模块组成的大型项目,每个模块都将一些内容打印到标准输出。现在,随着项目规模的扩大,没有大的项目。在标准输出上打印大量的print
语句,这使得程序变得相当慢。
因此,我现在想在运行时决定是否将任何内容打印到stdout。我不能在模块中进行更改,因为有很多模块。(我知道我可以将stdout重定向到一个文件,但即使这样也相当慢。)
所以我的问题是,如何将标准输出重定向为空,即如何使print
语句什么也不做?
# I want to do something like this.
sys.stdout = None # this obviously will give an error as Nonetype object does not have any write method.
目前,我唯一的想法是创建一个具有write方法的类(它什么也不做),并将stdout重定向到该类的一个实例。
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
在python中有没有内置的机制来解决这个问题呢?或者有比这更好的东西吗?
发布于 2011-07-19 00:16:03
跨平台:
import os
import sys
f = open(os.devnull, 'w')
sys.stdout = f
在Windows上:
f = open('nul', 'w')
sys.stdout = f
在Linux上:
f = open('/dev/null', 'w')
sys.stdout = f
发布于 2017-11-22 01:39:26
如果你使用的是python 3.4或更高版本,有一个使用标准库的简单而安全的解决方案:
import contextlib
with contextlib.redirect_stdout(None):
print("This won't print!")
发布于 2012-12-19 09:45:08
(至少在我的系统上)似乎写os.devnull比写DontPrint类快5倍。
#!/usr/bin/python
import os
import sys
import datetime
ITER = 10000000
def printlots(out, it, st="abcdefghijklmnopqrstuvwxyz1234567890"):
temp = sys.stdout
sys.stdout = out
i = 0
start_t = datetime.datetime.now()
while i < it:
print st
i = i+1
end_t = datetime.datetime.now()
sys.stdout = temp
print out, "\n took", end_t - start_t, "for", it, "iterations"
class devnull():
def write(*args):
pass
printlots(open(os.devnull, 'wb'), ITER)
printlots(devnull(), ITER)
给出了以下输出:
<open file '/dev/null', mode 'wb' at 0x7f2b747044b0>
took 0:00:02.074853 for 10000000 iterations
<__main__.devnull instance at 0x7f2b746bae18>
took 0:00:09.933056 for 10000000 iterations
https://stackoverflow.com/questions/6735917
复制相似问题