다음 코드를 사용하여 Linux / OSX에서 기본적으로 stderr에 쓰는 제어하지 않는 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
물론 여는 것도 괜찮지 만 이런 식으로 모든 출력 작업이 “진행 중”으로 발생합니다. 즉, OS와 그 반대로 컨텍스트 전환이없고 버퍼링도 없습니다 (일부 버퍼링은 일반적으로에서 사용됨 open
). 더 적은 메모리 소비.
답변
>>> import os
>>> os.devnull
'nul'
답변
아무것도하지 않는 파일 류 객체를 직접 만드시겠습니까?
class FakeSink(object):
def write(self, *args):
pass
def writelines(self, *args):
pass
def close(self, *args):
pass
답변
저렴한 솔루션 경고!
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