首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中将stdout重定向为"nothing“

在python中将stdout重定向为"nothing“
EN

Stack Overflow用户
提问于 2011-07-19 00:12:29
回答 11查看 102.9K关注 0票数 146

我有一个由足够多的模块组成的大型项目,每个模块都将一些内容打印到标准输出。现在,随着项目规模的扩大,没有大的项目。在标准输出上打印大量的print语句,这使得程序变得相当慢。

因此,我现在想在运行时决定是否将任何内容打印到stdout。我不能在模块中进行更改,因为有很多模块。(我知道我可以将stdout重定向到一个文件,但即使这样也相当慢。)

所以我的问题是,如何将标准输出重定向为空,即如何使print语句什么也不做?

代码语言:javascript
复制
# 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重定向到该类的一个实例。

代码语言:javascript
复制
class DontPrint(object):
    def write(*args): pass

dp = DontPrint()
sys.stdout = dp

在python中有没有内置的机制来解决这个问题呢?或者有比这更好的东西吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-07-19 00:16:03

跨平台:

代码语言:javascript
复制
import os
import sys
f = open(os.devnull, 'w')
sys.stdout = f

在Windows上:

代码语言:javascript
复制
f = open('nul', 'w')
sys.stdout = f

在Linux上:

代码语言:javascript
复制
f = open('/dev/null', 'w')
sys.stdout = f
票数 254
EN

Stack Overflow用户

发布于 2017-11-22 01:39:26

如果你使用的是python 3.4或更高版本,有一个使用标准库的简单而安全的解决方案:

代码语言:javascript
复制
import contextlib

with contextlib.redirect_stdout(None):
  print("This won't print!")
票数 18
EN

Stack Overflow用户

发布于 2012-12-19 09:45:08

(至少在我的系统上)似乎写os.devnull比写DontPrint类快5倍。

代码语言:javascript
复制
#!/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)

给出了以下输出:

代码语言:javascript
复制
<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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6735917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档