79 votes

Cross platform / dev / null en Python

J'utilise le code suivant pour masquer stderr sous Linux / OSX pour une bibliothèque Python que je ne contrôle pas qui écrit sur stderr par défaut:

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

Existe-t-il une alternative multi plate-forme facile à / dev / null? Idéalement, cela ne consommerait pas de mémoire car le processus est long.

134voto

msanders Points 2921

Qu'en est-il de os.devnull ?

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

43voto

Alex Martelli Points 330805
 class Devnull(object):
    def write(self, *_): pass

zookeeper.set_log_stream(Devnull())
 

Bien sûr, ouvrir os.devnull convient également, mais de cette manière, chaque opération de sortie se produit (en tant que noop) "en cours" - aucun changement de contexte sur le système d'exploitation et inversement, ni de mise en mémoire tampon (alors qu'une certaine mise en mémoire tampon est en cours). normalement utilisé par un open ) et donc encore moins de consommation de mémoire.

5voto

SilentGhost Points 79627
>>> import os
>>> os.devnull
'nul'

5voto

Andrew Aylett Points 16469

Créez votre propre objet de type fichier qui ne fait rien?

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

2voto

badp Points 5036

Avertissement de solution bon marché!

 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X