Pythonのクロスプラットフォーム/ dev / null


83

次のコードを使用して、PythonライブラリのLinux / OSXでstderrを非表示にしています。デフォルトでは、stderrへの書き込みを制御していません。

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

/ dev / nullに代わる簡単なクロスプラットフォームはありますか?これは長時間実行されるプロセスであるため、理想的にはメモリを消費しません。



8
@msw:そうは思いませんが、Pythonにはこの問題に対処する方法が他にもあります。
Andrew Aylett 2010年

回答:



46
class Devnull(object):
    def write(self, *_): pass

zookeeper.set_log_stream(Devnull())

os.devnullもちろん、開くことも問題ありませんが、この方法では、すべての出力操作が(noopとして)「処理中」に発生します。OSへのコンテキストスイッチやその逆はなく、バッファリングもありません(通常、一部のバッファリングはによって使用されますopen)。さらに少ないメモリ消費。


6
os.devnullを使用するとオーバーヘッドが発生する可能性があることを理解しています。しかし、オブジェクトを使用する場合、writezookeeperオブジェクトが他のメソッドを呼び出してからlog_streamファイルオブジェクトを呼び出すとどうなるでしょうか。多分それはwritelinesメソッドを呼び出しますか?次に、例外があります。
miracle173 2014

5
これは、実際のファイルが必要な場合は機能しませんfileno()
Jonathon Reinhart 2015

@JonathonReinhartそのために、(すべてのデータがとにかく破棄さos.open(os.devnull, os.O_RDWR)れるため)への後続の呼び出しに同じfdを使用して生成し、要求に応じてファイル記述子を遅延的に作成できると思いますfileno
minmaxavg 2017

また、必要になりますclose()
シューッという音を立てる

5
>>> import os
>>> os.devnull
'nul'

11
明確にするために:「nul」はWindowsで与えられます。Linuxは「/ dev / null」を返します。
ウォルター

5

何もしない独自のファイルのようなオブジェクトを作成しますか?

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

1
慣例的にはあなたは正しいですが、「self」は単なる別のパラメータであり、の最初の要素として渡されargsます。パラメータを使用しないため、気にする唯一の理由は美的です。私は...それを修正します
アンドリューAylett

2
一部の操作には「fileno」も必要です
Jonathan Hartley

2

安い解決策の警告!

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

私は楽しみのためにデコレータを
投入しました

また、出入りする必要ありますか?
user48956 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.