पायथन में क्रॉस प्लेटफॉर्म / देव / नल


85

मैं पायथन लाइब्रेरी के लिए लिनक्स / OSX पर stderr को छिपाने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं, मैं नियंत्रित नहीं करता हूं कि डिफ़ॉल्ट रूप से stderr को लिखता है:

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

वहाँ एक आसान पार मंच विकल्प के लिए / देव / अशक्त है? आदर्श रूप से यह स्मृति का उपभोग नहीं करेगा क्योंकि यह एक लंबी चलने वाली प्रक्रिया है।



8
@msw: मुझे नहीं लगता कि, पायथन के पास इस मुद्दे से निपटने के अधिक तरीके हैं।
— एंड्रयू ऐलेट

जवाबों:



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

zookeeper.set_log_stream(Devnull())

उद्घाटन os.devnullठीक है, लेकिन इस तरह से हर आउटपुट ऑपरेशन होता है (एक noop के रूप में) "प्रक्रिया में" - ओएस और वापस करने के लिए कोई संदर्भ स्विच नहीं, और भी कोई बफरिंग नहीं है (जबकि कुछ बफ़रिंग सामान्य रूप से उपयोग किया जाता है open) और इस तरह स्मृति की खपत भी कम होती है।


6
मैं समझता हूं कि os.devnull के उपयोग से कुछ ओवरहेड का उत्पादन हो सकता है। लेकिन अगर कोई आपकी वस्तु का उपयोग करता है तो क्या होगा अगर writeज़ूकेर ऑब्जेक्ट अन्य विधियों को उसके log_stream फ़ाइल ऑब्जेक्ट को कॉल करता है? शायद इसे writelinesविधि कहते हैं ? फिर एक अपवाद है।
— चमत्कार 173

5
यह काम नहीं करता है जब आपको एक वास्तविक फ़ाइल की आवश्यकता होती है , जैसे कि एक के साथ fileno()।
— जोनाथन रेनहार्ट

@JonathonReinhart उस के लिए, मुझे लगता है कि आप फ़ाइल डिस्क्रिप्टर का अनुरोध कर सकते हैं lazily अनुरोध पर, os.open(os.devnull, os.O_RDWR)बाद में कॉल के लिए एक ही fd का उपयोग और पैदावार कर सकते हैं fileno(क्योंकि सभी डेटा को वैसे भी छोड़ दिया जाता है)
— minmaxxg

आपको यह भी चाहिएclose()
— shoosh

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

11
बस स्पष्ट करने के लिए: 'nul' विंडोज पर दिया गया है। लिनक्स '/ dev / null' लौटाएगा।
— वाल्टर

5

अपनी खुद की फ़ाइल की तरह ऑब्जेक्ट बनाएँ जो कुछ भी नहीं करता है?

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

1
मुहावरेदार, आप सही हैं, लेकिन 'स्व' सिर्फ एक और पैरामीटर है और इसे पहले तत्व के रूप में पारित किया जाएगा args। जैसा कि हम किसी भी पैरामीटर का उपयोग नहीं करते हैं, देखभाल करने का एकमात्र कारण सौंदर्य है। मैं इसे ठीक कर लूंगा ...
— एंड्रयू एलेट

2
कुछ ऑपरेशनों के लिए भी 'फ़ेलेनो' की ज़रूरत होती है
— जोनाथन हार्टले

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.