我正在使用以下代码在Linux / OSX上为Python库隐藏stderr,但我不控制默认情况下写入stderr的Python库:
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
是否有一个简单的跨平台替代/ dev / null?理想情况下,它不会消耗内存,因为这是一个长期运行的过程。
Answers:
os.devnull怎么样?
import os
f = open(os.devnull,"w")
zookeeper.set_log_stream(f)
class Devnull(object):
def write(self, *_): pass
zookeeper.set_log_stream(Devnull())
os.devnull当然,打开也可以,但是这样,每个输出操作都会“进行中”(作为noop)发生-没有上下文切换到操作系统,也没有缓冲(虽然缓冲通常由来使用open),因此甚至更少的内存消耗。
write其log_stream文件对象的其他方法,该怎么办?也许它调用了writelines方法?然后有一个例外。
fileno()。
os.open(os.devnull, os.O_RDWR)对随后的调用使用并产生相同的fd fileno(因为无论如何都丢弃了所有数据)
close()
便宜的解决方案警告!
class DevNull():
def __init__(self, *args):
self.closed = False
self.mode = "w"
self.name = "<null>"
self.encoding = None
self.errors = None
self.newlines = None
self.softspace = 0
def close(self):
self.closed == True
@open_files_only
def flush(self):
pass
@open_files_only
def next(self):
raise IOError("Invalid operation")
@open_files_only
def read(size = 0):
raise IOError("Invalid operation")
@open_files_only
def readline(self):
raise IOError("Invalid operation")
@open_files_only
def readlines(self):
raise IOError("Invalid operation")
@open_files_only
def xreadlines(self):
raise IOError("Invalid operation")
@open_files_only
def seek(self):
raise IOError("Invalid operation")
@open_files_only
def tell(self):
return 0
@open_files_only
def truncate(self):
pass
@open_files_only
def write(self):
pass
@open_files_only
def writelines(self):
pass
def open_files_only(fun):
def wrapper(self, *args):
if self.closed:
raise IOError("File is closed")
else:
fun(self, *args)
return wrapper