2013-01-22 20 views
152

मैं warnings लाइब्रेरी का उपयोग करके बेकार चेतावनियों को फेंकने के साथ कोड के साथ काम कर रहा हूं। प्रलेखन (स्कैनिंग) को पढ़ना मुझे केवल to disable warnings for single functions मिला। लेकिन मैं इतना कोड बदलना नहीं चाहता हूं।पाइथन चेतावनियों को अक्षम करने के लिए कैसे करें

क्या शायद python -no-warning foo.py जैसे ध्वज है?

आप क्या सलाह देंगे?

+4

आप चेतावनियों को अक्षम क्यों करना चाहते हैं? उन्हें ठीक/लंबे समय तक बेहतर नहीं करना चाहिए? आमतौर पर चेतावनी एक कारण के लिए उठाई जाती है, उन्हें अनदेखा/चुपचाप शायद भविष्य में बड़ी समस्याओं का कारण बन जाएगा। –

+5

आप पूरी तरह से सही हैं, मैंने आपको आपकी टिप्पणी के लिए +1 दिया है, लेकिन जैसा कि मैंने "फिलहाल" मेरे लिए बेकार लिखा है। – Framester

+5

@ मार्टिन सैमसन मैं आम तौर पर सहमत हूं, लेकिन चेतावनियों को अनदेखा करने के लिए वैध मामले हैं। मुझे इनमें से कई को defusedxml में वैध एक्सपैथ वाक्यविन्यास का उपयोग करने से मिलता है: 'भविष्य चेतावनी: यह खोज 1.3 और उससे पहले में टूट गई है, और भविष्य के संस्करण में तय की जाएगी। यदि आप वर्तमान व्यवहार पर भरोसा करते हैं, तो इसे [इस अन्य चीज़] में बदलें। मैं अब चेतावनियों को अनदेखा कर दूंगा और एक हानिरहित चेतावनी से बचने के लिए अनावश्यक रूप से बदसूरत कोड लिखने से चुपचाप तय होने की प्रतीक्षा करूंगा। – Pedro

उत्तर

162

-W option है। आप अजगर किए गए दस्तावेज़ों की suppress warnings अनुभाग देखें

python -W ignore foo.py

213

किया?

आप कोड है कि आप जानते हैं कि इस तरह के एक पदावनत समारोह के रूप में, एक चेतावनी बढ़ा देंगे प्रयोग कर रहे हैं, लेकिन चेतावनी को देखने के लिए नहीं करना चाहते हैं, तो यह catch_warnings संदर्भ प्रबंधक का उपयोग कर चेतावनी को दबाने के लिए संभव है:

import warnings 

def fxn(): 
    warnings.warn("deprecated", DeprecationWarning) 

with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 
    fxn() 

मैं इसे नज़रअंदाज़ नहीं है, लेकिन आप सिर्फ इस के साथ सभी चेतावनियों को दबाने सकता है:

import warnings 
warnings.filterwarnings("ignore") 

पूर्व:

>>> import warnings 
>>> def f(): 
... print('before') 
... warnings.warn('you are warned!') 
... print('after') 
>>> f() 
before 
__main__:3: UserWarning: you are warned! 
after 
>>> warnings.filterwarnings("ignore") 
>>> f() 
before 
after 
+0

तो आपको प्रत्येक फाइल में कोड को 'चेतावनियों के साथ' लपेटना होगा। Catch_warnings(): '? – Framester

+7

@ फ्रैमेस्टर - हाँ, आईएमओ यह विशिष्ट चेतावनियों को दबाने का सबसे साफ तरीका है, चेतावनियां सामान्य रूप से होती हैं क्योंकि कुछ गलत हो सकता है, इसलिए कमांड लाइन के माध्यम से सभी चेतावनियों को दबाने से सबसे अच्छा शर्त नहीं हो सकती है। – Mike

+1

@ फ्रैमेस्टर - मैंने एक उदाहरण के साथ अन्य विकल्प भी सूचीबद्ध किया है ... मुझे यह पसंद नहीं है (कारण मैंने पिछली टिप्पणी में दिया था) लेकिन कम से कम अब आपके पास टूल्स हैं। – Mike

46

तुम भी (2010 में नई सुविधा - यानी अजगर 2.7) एक वातावरण चर को परिभाषित कर सकते

export PYTHONWARNINGS="ignore" 

टेस्ट इस तरह: डिफ़ॉल्ट

$ export PYTHONWARNINGS="default" 
$ python 
>>> import warnings 
>>> warnings.warn('my warning') 
__main__:1: UserWarning: my warning 
>>> 

पर ध्यान न दें चेतावनी

$ export PYTHONWARNINGS="ignore" 
$ python 
>>> import warnings 
>>> warnings.warn('my warning') 
>>> 
+5

एफडब्ल्यूआईडब्ल्यू "2010 में नई सुविधा" का अर्थ है कि यह पायथन 2.7 के लिए काम करता है लेकिन 2.6 या पुराने 2.x रिलीज़ के लिए नहीं। (मुझे इसे देखना था। मेरे पास अभी भी उत्पादन में पायथन 2.6 है ...) –

+2

दाएं। पायथन 2.7 अंक –

+1

यह परीक्षण करते समय चेतावनियों को अनदेखा करना विशेष रूप से उपयोगी होता है। 'Tox' का उपयोग करके,' सेटनव 'में' PYTHONWARNINGS = अनदेखा 'जोड़ना आउटपुट को कम गंदा बनाता है। –

2

चेतावनियां stderr के माध्यम से आउटपुट होती हैं और सरल समाधान सीएलआई को '2>/dev/null' जोड़ना है। यह कई उपयोगकर्ताओं को बहुत समझ में आता है जैसे सेंटोस 6 वाले जो पाइथन 2.6 निर्भरताओं (जैसे यम) से फंस गए हैं और विभिन्न मॉड्यूल को उनके कवरेज में विलुप्त होने के किनारे धकेल दिया जा रहा है।

यह विशेष रूप से एसएनआई एट कैटेरा से जुड़े क्रिप्टोग्राफी के लिए सच है। कोई भी https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

चेतावनी अभी भी जगह पर है, लेकिन आप जो कुछ भी चाहते हैं वह बैक-पोर्ट किया गया है। stderr का पुनः निर्देश आपको साफ टर्मिनल/खोल आउटपुट के साथ छोड़ देगा हालांकि stdout सामग्री स्वयं नहीं बदलेगी।

FriendFX का जवाब देना। वाक्य एक (1) एक सार्वभौमिक समाधान के साथ सीधे समस्या का जवाब देता है। वाक्य दो (2) ध्यान में रखते हुए उद्धृत एंकर फिर से 'चेतावनियों को अक्षम' करता है जो कि Python 2.6 विशिष्ट है और नोट करता है कि RHEL/Centos 6 उपयोगकर्ता सीधे 2.6 के बिना नहीं कर सकते हैं। हालांकि कोई विशिष्ट चेतावनियां उद्धृत नहीं की गई थीं, पैरा दो (2) 2.6 प्रश्नों का उत्तर देते हैं, मैं अक्सर क्रिप्टोग्राफी मॉड्यूल में शॉर्ट-कॉमिंग प्राप्त करता हूं और कैसे कोई "आधुनिकीकरण" (यानी अपग्रेड, बैकपोर्ट, फिक्स) पाइथन के एचटीटीपीएस/टीएलएस प्रदर्शन । पैरा तीन (3) मॉड्यूल/निर्भरताओं को फिर से निर्देशित करने और अपग्रेड करने के नतीजे बताते हैं।

+2

उत्तर देने के लिए समय निकालने के लिए धन्यवाद। कृपया उत्तर पर सख्ती से जवाब रखें हालांकि: आप कुछ ऐसी चीजों का जिक्र करते हैं जो इस सवाल के लिए अप्रासंगिक हैं क्योंकि वर्तमान में यह सेंटोस, पायथन 2.6, क्रिप्टोग्राफी, यूआरएलआईबी, बैक-पोर्टिंग है। आप उन बिट्स को हटाने के लिए अपना प्रश्न संपादित कर सकते हैं। यदि आप ओपी से अधिक जानकारी जानना चाहते हैं, तो इसके बजाय प्रश्न के तहत एक टिप्पणी छोड़ दें। – FriendFX

4

यह एक पुरानी सवाल है लेकिन वहाँ PEP 565 में कुछ नए मार्गदर्शन कि बंद सभी चेतावनियों चालू करने के लिए यदि आप एक अजगर आवेदन लिख रहे हैं आप का उपयोग करना चाहिए है:

import sys 
import warnings 

if not sys.warnoptions: 
    warnings.simplefilter("ignore") 

कारण यह सिफारिश की है यह है कि है डिफ़ॉल्ट रूप से सभी चेतावनियों को बंद कर देता है लेकिन महत्वपूर्ण रूप से उन्हें कमांड लाइन या PYTHONWARNINGS पर python -W के माध्यम से वापस स्विच करने की अनुमति देता है।

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