Używam następującego kodu, aby ukryć stderr w systemie Linux / OSX dla biblioteki Python, której nie kontroluję, która domyślnie zapisuje do stderr:
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
Czy istnieje łatwa wieloplatformowa alternatywa dla / dev / null? Idealnie byłoby, gdyby nie zużywał pamięci, ponieważ jest to długotrwały proces.
Odpowiedzi:
A co z os.devnull ?
import os f = open(os.devnull,"w") zookeeper.set_log_stream(f)
źródło
class Devnull(object): def write(self, *_): pass zookeeper.set_log_stream(Devnull())
Otwarcie też
os.devnull
jest w porządku, ale w ten sposób każda operacja wyjściowa jest wykonywana (jako noop) „w toku” - bez przełączania kontekstu na system operacyjny iz powrotem, a także bez buforowania (podczas gdy pewne buforowanie jest normalnie używane przez anopen
), a zatem jeszcze mniejsze zużycie pamięci.źródło
write
wywoła inne metody niż jego obiekt pliku log_stream? Może wywołujewritelines
metodę? Wtedy jest wyjątek.fileno()
. Z rozszerzeniem .os.open(os.devnull, os.O_RDWR)
tego samego fd dla kolejnych wywołańfileno
(ponieważ i tak wszystkie dane są odrzucane)close()
>>> import os >>> os.devnull 'nul'
źródło
Utworzyć własny obiekt przypominający plik, który nic nie robi?
class FakeSink(object): def write(self, *args): pass def writelines(self, *args): pass def close(self, *args): pass
źródło
args
. Ponieważ nie stosujemy żadnego z parametrów, jedynym powodem do dbałości jest estetyka. Naprawię to ...Ostrzeżenie o niedrogim rozwiązaniu!
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
źródło