I'm using the following code to hide stderr on Linux/OSX for a Python library I do not control that writes to stderr by default:
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
Is there an easy cross platform alternative to /dev/null? Ideally it 开发者_Python百科would not consume memory since this is a long running process.
How about 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())
Opening os.devnull
is fine too of course, but this way every output operation occurs (as a noop) "in process" -- no context switch to the OS and back, and also no buffering (while some buffering is normally used by an open
) and thus even less memory consumption.
>>> import os
>>> os.devnull
'nul'
Create your own file-like object which doesn't do anything?
class FakeSink(object):
def write(self, *args):
pass
def writelines(self, *args):
pass
def close(self, *args):
pass
Cheap solution warning!
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
精彩评论