我有一个使用上下文管理协议的类有一段时间的静默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
答案 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方法。我知道这两个选项都有效,但更感兴趣的是看看哪些看起来更干净(尤其是打开文件的开销可以忽略不计)。