Кросс-платформа/dev/null в Python

Я использую следующий код, чтобы скрыть stderr в Linux/OSX для библиотеки Python. Я не контролирую, что пишет stderr по умолчанию:

f = open("/dev/null","w")
zookeeper.set_log_stream(f)

Есть ли простая альтернатива перекрестной платформе /dev/null? В идеале это не будет потреблять память, так как это длительный процесс.

Ответ 1

Как насчет os.devnull?

import os
f = open(os.devnull,"w")
zookeeper.set_log_stream(f)

Ответ 2

class Devnull(object):
    def write(self, *_): pass

zookeeper.set_log_stream(Devnull())

Открытие os.devnull тоже прекрасное, конечно, но таким образом каждая операция вывода происходит (как noop) "in process" - без контекстного переключения на ОС и обратно, а также без буферизации (в то время как некоторая буферизация обычно используемый open) и, следовательно, еще меньшее потребление памяти.

Ответ 3

>>> import os
>>> os.devnull
'nul'

Ответ 4

Создайте свой собственный файловый объект, который ничего не делает?

class FakeSink(object):
    def write(self, *args):
        pass
    def writelines(self, *args):
        pass
    def close(self, *args):
        pass

Ответ 5

Дешевое решение!

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