Ich verwende den folgenden Code, um stderr unter Linux / OSX für eine Python-Bibliothek auszublenden, die ich nicht kontrolliere und die standardmäßig in stderr schreibt:
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
Gibt es eine einfache plattformübergreifende Alternative zu / dev / null? Im Idealfall wird kein Speicher belegt, da dies ein langwieriger Prozess ist.
Antworten:
Wie wäre es mit os.devnull ?
import os f = open(os.devnull,"w") zookeeper.set_log_stream(f)
quelle
class Devnull(object): def write(self, *_): pass zookeeper.set_log_stream(Devnull())
Das Öffnen
os.devnull
ist natürlich auch in Ordnung, aber auf diese Weise erfolgt jede Ausgabeoperation (als Noop) "in Bearbeitung" - kein Kontextwechsel zum Betriebssystem und zurück und auch keine Pufferung (während eine gewisse Pufferung normalerweise von einem verwendet wirdopen
) und somit noch weniger Speicherverbrauch.quelle
write
als sein log_stream- Dateiobjekt aufruft ? Vielleicht ruft es diewritelines
Methode auf? Dann gibt es eine Ausnahme.fileno()
. B. eine mit .os.open(os.devnull, os.O_RDWR)
und dieselbe fd für nachfolgende Aufrufe vonfileno
(da alle Daten sowieso verworfen werden) verwendenclose()
>>> import os >>> os.devnull 'nul'
quelle
Erstellen Sie Ihr eigenes dateiähnliches Objekt, das nichts tut?
class FakeSink(object): def write(self, *args): pass def writelines(self, *args): pass def close(self, *args): pass
quelle
args
. Da wir keinen der Parameter verwenden, ist der einzige Grund zur Sorge die Ästhetik. Ich werde es reparieren ...Günstige Lösungswarnung!
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
quelle