Я использую следующий код, чтобы скрыть stderr в Linux / OSX для библиотеки Python, которую я не контролирую, которая по умолчанию записывает в stderr:
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
Есть ли простая кроссплатформенная альтернатива / dev / null? В идеале он не будет потреблять память, поскольку это длительный процесс.
Ответы:
Как насчет 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()
>>> import os >>> os.devnull 'nul'
источник
Создать свой собственный файловый объект, который ничего не делает?
class FakeSink(object): def write(self, *args): pass def writelines(self, *args): pass def close(self, *args): pass
источник
args
. Поскольку мы не используем ни один из параметров, единственная причина для беспокойства - эстетическая. Я исправлю ...Предупреждение о дешевом решении!
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
источник