次のコードを使用して、PythonライブラリのLinux / OSXでstderrを非表示にしています。デフォルトでは、stderrへの書き込みを制御していません。
f = open("/dev/null","w")
zookeeper.set_log_stream(f)
/ dev / nullに代わる簡単なクロスプラットフォームはありますか?これは長時間実行されるプロセスであるため、理想的にはメモリを消費しません。
次のコードを使用して、PythonライブラリのLinux / OSXでstderrを非表示にしています。デフォルトでは、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もちろん、開くことも問題ありませんが、この方法では、すべての出力操作が(noopとして)「処理中」に発生します。OSへのコンテキストスイッチやその逆はなく、バッファリングもありません(通常、一部のバッファリングはによって使用されますopen)。さらに少ないメモリ消費。
writezookeeperオブジェクトが他のメソッドを呼び出してからlog_streamファイルオブジェクトを呼び出すとどうなるでしょうか。多分それはwritelinesメソッドを呼び出しますか?次に、例外があります。
fileno()。
os.open(os.devnull, os.O_RDWR)れるため)への後続の呼び出しに同じfdを使用して生成し、要求に応じてファイル記述子を遅延的に作成できると思いますfileno
close()
何もしない独自のファイルのようなオブジェクトを作成しますか?
class FakeSink(object):
def write(self, *args):
pass
def writelines(self, *args):
pass
def close(self, *args):
pass
argsます。パラメータを使用しないため、気にする唯一の理由は美的です。私は...それを修正します
安い解決策の警告!
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