大多数pythonic方式忽略输出

时间:2009-11-25 22:34:49

标签: python

我有一个使用上下文管理协议的类有一段时间的静默stderr流(主要用于py2exe部署,其中应用程序向stderr写任何内容会导致应用程序关闭时出现丑陋的对话框,而且我'我做的事我知道会有一些stderr输出)

import sys
import os
from contextlib import contextmanager

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

我的问题是什么会更加pythonic,打开系统的位桶和写入的相当干净的解决方案,或跳过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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我觉得nullWriter类会更“Pythonic”,因为它使用已经存在的Python接口(你可以将sys.stderr分配给任何有write方法的东西),而不是必须去系统环境并写入“位桶”,如下所示:)

答案 2 :(得分:2)

这是使用已存在的事物(os.devnull)之间的决定,但有点“混乱”(你需要open()等等),并创建自己的解决方案,这可能更简单,但这是你正在创造的新课程。

虽然两者都完全没问题,但我会选择nullWriter,因为它更干净,依赖于纯粹的python知识,并且不会破坏os事物。

答案 3 :(得分:1)

这有什么问题?

import sys

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

答案 4 :(得分:0)

感谢大家的回复。

我想我会采用nullWriter方法。我知道这两个选项都有效,但更感兴趣的是看看哪些看起来更干净(尤其是打开文件的开销可以忽略不计)。