2009-11-29 19 views
12

में एक --quiet विकल्प को कार्यान्वित करने का एक आसान तरीका क्या है एक कमांड लाइन पायथन स्क्रिप्ट पर काम कर रहा हूं - पूरे स्क्रिप्ट में, मेरे पास बहुत सारी जानकारी है I टर्मिनल विंडो में print है ताकि मैं कर सकूं क्या हो रहा है के साथ पालन करें।एक पायथन लिपि

OptionParser का उपयोग करके मैं --quiet विकल्प जोड़ना चाहता हूं ताकि मैं सभी आउटपुट चुप कर सकूं।

if not QUIET: # global variable set by OptionParser 
    print " my output " 

Am अजगर के लिए नए और यकीन है कि वहाँ एक बेहतर तरीका है: मैं स्क्रिप्ट में इस लागू करने के बारे में जाने के लिए इतना है कि मैं कुछ ऐसा कर नहीं अंत तक कर एक pythonic तरीका के लिए देख रहा हूँ। विचार?

उत्तर

27

आप logging का उपयोग कर सकते हैं और उन चीजों को असाइन कर सकते हैं जिन्हें QUIET एक अलग लॉग स्तर मुद्रित नहीं किया जाना चाहिए।

संपादित करें:THC4K's answer ऐसा करने के तरीके, यह सोचते हैं कि सभी उत्पादन चुप होना चाहिए, अगर QUIET सेट किया गया है का एक उदाहरण दिखाता। ध्यान दें कि अजगर 3 में from __future__ import print_function आवश्यक नहीं है:

print = logging.info 
logging.basicConfig(level=logging.WARNING if QUIET else logging.INFO, 
        format="%(message)s") 

महत्वपूर्ण उत्पादन कि --quiet द्वारा खामोश नहीं किया जाना चाहिए के लिए के लिए, उदाहरण के लिए परिभाषितiprint:

iprint = logging.warning 
+4

+1 व्हील-रीइन्वेन्शन – tosh

+2

के बजाय लॉगिंग की सिफारिश करने के लिए +1 मैंने बहुत ही संक्षेप में 'लॉगिंग' देखा - क्या इसका मतलब यह है कि, प्रिंट के बदले में, मैं 'लॉगिंग' पर टेक्स्ट संदेश भेज सकता था और फिर ('__main__' निर्णय में क्या संदेश 'मुद्रित' था, फ़ाइल में सहेजा गया था, या सिर्फ चुपचाप? – thornomad

+0

लॉगिंग के लिए +1। – alternative

2

प्रोग्राम शांत मोड में है या नहीं, तो आप केवल अपने आउटपुट फ़ंक्शन को संशोधित क्यों नहीं करते हैं, इसलिए आप केवल एक बार चेक करते हैं?

if QUIET: 
    def DoOutput(stuff): 
     pass 
else: 
    def DoOutput(stuff): 
     print(stuff) 

या, आप निश्चित रूप से अपने उत्पादन समारोह के अंदर QUIET के लिए चेक डाल सकता है:

def DoOutput(stuff): 
    if QUIET: 
     print(stuff) 

स्थिति है कि आप का वर्णन किया है वास्तव में कारण है कि अजगर 3 से print बदल गया है में से एक है एक वास्तविक कार्य के लिए एक कीवर्ड: लोगों की बड़ी परियोजनाएं print पर एक कीवर्ड होने पर बहुत निर्भर हो रही थीं, और तब जब यह संशोधित करने का समय आया कि आउटपुट कैसे दर्ज किया गया था, तो इसे एक बड़े पैमाने पर रिफैक्टरिंग की आवश्यकता थी; जबकि print एक उचित कार्य है, तो आप इसे फिर से परिभाषित कर सकते हैं, ताकि print(foo) उदाहरण के लिए लॉग फ़ाइल में आउटपुट हो। यही कारण है कि print आपकी स्क्रिप्ट के बारे में बिखरे हुए होने के बजाय, अपने आउटपुट/लॉगिंग को वास्तविक फ़ंक्शन में लपेटना बेहतर अभ्यास है।

0

यदि आप इसे त्वरित और गंदे चाहते हैं और आप से सभी आउटपुट से छुटकारा पाना चाहते हैं तो stdout और stderr को/dev/null पर रीडायरेक्ट करें। रखो:

sys.stdout = open("/dev/null", "a") 
sys.stderr = open("/dev/null", "a") 

उस बिंदु पर जहां आप --quiet का पता लगाते हैं।

+0

इससे शायद साइगविन के बिना विंडोज़ पर चल रहे प्रोग्राम के किसी भी मौके को नष्ट कर दिया जाएगा, है ना? विंडोज़ में/dev/null नहीं है। – alternative

0
if QUIET: 
    sys.stdout=open("/dev/null","w") 
... 
print 'my output' 

Windows में पहले "/ dev/बातिल" के बदले "नुल" का उपयोग

+4

'os.devnull' का उपयोग करना बेहतर है - यह आपको ऑपरेटिंग सिस्टम के आधार पर "/ dev/null" या "nul" देगा। – Teddy

11

python myscript.py > /dev/null

परिवर्तन उत्पादन के रूप में यह चलाकर सभी उत्पादन मौन कर सकते हैं स्क्रिप्ट में स्ट्रीम:

if QUIET: 
    sys.stdout = open(os.devnull,'a') 
    sys.stderr = open(os.devnull,'a') 
print something 

उपयोग एक अलग प्रिंट समारोह

from __future__ import print_function 
if QUIET: 
    def print(*args): 
     pass 
print(something) 

उपयोग प्रवेश और loglevels

from __future__ import print_function 
import logging 
logging.basicConfig(level=logging.INFO, format="%(message)s") 
print = logging.info 
if QUIET: 
    logging.basicConfig(level=logging.ERROR) 

print(something) 
+1

लॉगिंग कॉन्फ़िगरेशन के लिए +1। – alternative

1

आप एक प्रॉक्सी है कि लिखने के लिए या कॉल writelines फिल्टर के साथ stdout की जगह सकता है:

class FileProxy(object): 
    def __init__(self, real_file, quiet_flag): 
     self.real_file = real_file 
     self.quiet_flag = quiet_flag 

    def write(self, string): 
     if not self.quiet_flag: 
      self.real_file.write(string) 

    def writelines(self, strings): 
     if not self.quiet_flag: 
      self.real_file.write(strings) 

    def __getattr__(self, name): 
     return getattr(self.file, name) 

import sys 
sys.stdout = FileProxy(sys.stdout, QUIET) 

इस का लाभ यह है कि यह क्रॉस प्लेटफार्म है (लिखने के विपरीत/dev/null) और यह अभी भी तीसरे पक्ष के पुस्तकालयों में प्रिंट स्टेटमेंट के लिए काम करेगा जिन पर आपका नियंत्रण नहीं है। आप जो भी लिखा है, उस पर अधिक नियंत्रण देने के लिए आप इसे और भी परिशोधित कर सकते हैं, उदा। एक टाइमस्टैंप जोड़ने के लिए, या लॉगिंग सिस्टम में प्रिंट कथन को पुनर्निर्देशित करने के लिए।

संबंधित मुद्दे