2009-11-25 95 views
2

我有它使用上下文管理协议有一会儿(主要用于py2exe部署,其中应用任何内容写入标准错误导致难看的对话无声的标准错误流的一类最Python的方式时,应用程序是封闭的,而我这样做,我知道会有一些标准错误输出的东西)忽略输出

import sys 
import os 
from contextlib import contextmanager 

@contextmanager 
def noStderr(): 
    stderr = sys.stderr 
    sys.stderr = open(os.devnull, "w") 
    yield 
    sys.stderr = stderr 

我的问题是,什么是更Python,打开系统的比特斗和写入的是,的合理的清洁液或跳过FD的分配和写入操作,并创建一个新的类ALA:

class nullWriter(object): 
    def write(self, string): 
     pass 

,然后用

from contextlib import contextmanager 

@contextmanager 
def noStderr(): 
    stderr = sys.stderr 
    sys.stderr = nullWriter() 
    yield 
    sys.stderr = stderr 

回答

4

我认为后一种解决方案是更优雅。您避免进入系统环境,可能会浪费fd。为什么在不需要时退出操作系统?

3

我觉得nullWriter类会更“Python化”,因为它使用Python接口已经到位(可分配sys.stderr到任何有替换上面的代码写方法),而不是走出去的系统环境,并写入“位桶”你把它:)

+2

而FWIW,我会说,写“位斗”将是一个更Perlish的解决方案:) – Chirael 2009-11-25 22:41:50

2

它使用已经存在的东西(os.devnull)之间的决定,但都有点“混乱”(你需要open()这等“),并创建自己的解决方案,这可能是简单的,但它是一个新的类,你正在创造。

虽然两者都很好,但我会用nullWriter,因为它更干净,并且依赖于纯粹的Python知识,不会混淆os的东西。

1

这有什么错呢?

import sys 

sys.stderr = open('/dev/null', 'w') 
+2

作为abyx建议,你应该使用os.devnull独立于平台。由于OP提到了py2exe,这可能是一个Windows盒子。 – 2009-11-26 07:38:36

+0

是真的。然而,这不是重点。我并不担心那些演示解决方案的几行代码的可移植代码。 – 2009-11-26 08:33:12

+0

但是,由于他很可能在Windows系统中,他可能甚至不知道/ dev/null的含义,使得你的建议不如应有的帮助。 – 2009-11-27 08:33:35

0

感谢所有的答复。

我想我会用nullWriter方法去。我知道这两个选项都可以工作,但更感兴趣的是看看什么更清晰(尤其是打开文件的开销可忽略不计)。