अजगर की चेतावनी को कैसे निष्क्रिय करें


419

मैं कोड के साथ काम कर रहा हूं जो warningsपुस्तकालय के उपयोग से बहुत सारी (मेरे लिए) बेकार चेतावनी देता है। दस्तावेज़ीकरण पढ़ना (/ स्कैनिंग) मुझे केवल एकल कार्यों के लिए चेतावनी को अक्षम करने का एक तरीका मिला । लेकिन मैं इतना कोड बदलना नहीं चाहता।

क्या कोई झंडा जैसा है python -no-warning foo.py?

आप क्या सुझाव देंगे?


9
@MartinSamson मैं आम तौर पर सहमत हूं, लेकिन चेतावनियों की अनदेखी करने के लिए वैध मामले हैं। मैं इनमें से कई को डिफ्यूज़एक्सलाम में मान्य एक्सपैथ सिंटैक्स का उपयोग करने से प्राप्त करता हूं FutureWarning: This search is broken in 1.3 and earlier, and will be fixed in a future version. If you rely on the current behaviour, change it to [this other thing]:। मैं अब चेतावनियों को नजरअंदाज करना चाहूंगा और इसके लिए चुपचाप इंतजार करना होगा कि एक हानिरहित चेतावनी से बचने के लिए अनावश्यक रूप से बदसूरत कोड लिखने की अपेक्षा।
पेड्रो

1
विशिष्ट चेतावनियाँ अक्षम करें: stackoverflow.com/questions/9134795/…
user3226167

जवाबों:



576

क्या आपने अजगर डॉक्स के दमन चेतावनी खंड को देखा?

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

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

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

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

41
यदि आप केवल एक विशिष्ट श्रेणी से चेतावनियों को पकड़ने की उम्मीद करते हैं, तो आप इसे categoryतर्क का उपयोग करके पारित कर सकते हैं :warnings.filterwarnings("ignore", category=DeprecationWarning)
ओस्ट्रोकैच

1
यह मेरे लिए इस मामले में उपयोगी है क्योंकि html5lib lxml चेतावनियों से बाहर निकलता है, हालांकि यह xml पार्स नहीं कर रहा है। धन्यवाद
jamescampbell

5
warnings.filterwarnings फ़ंक्शन के लिए एक उपयोगी पैरामीटर भी है module:। यह आपको निर्दिष्ट मॉड्यूल से चेतावनी को अनदेखा करने की अनुमति देता है।
उपयोगकर्ता नाम

103

आप एक पर्यावरण चर (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')
>>> 

के लिए प्रतिवाद चेतावनी पर एक नजर है कैसे करने के लिए उपेक्षा-प्रतिवाद-चेतावनी-इन-अजगर

यहां कॉपी किया गया ...

warningsमॉड्यूल के प्रलेखन से :

 #!/usr/bin/env python -W ignore::DeprecationWarning

यदि आप विंडोज पर हैं: -W ignore::DeprecationWarningपायथन के तर्क के रूप में पास करें । हालांकि, इस मुद्दे को हल करने के लिए बेहतर है, इंट का कास्टिंग करके ।

(ध्यान दें कि पायथन 3.2 में, डिफ़ॉल्ट रूप से डेप्रिसिएशन चेतावनियों को अनदेखा किया गया है।)

या:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    import md5, sha

yourcode()

अब आप अभी भी अन्य सभी प्राप्त DeprecationWarningकरते हैं, लेकिन इसके कारण नहीं हैं:

import md5, sha

2
परीक्षण करते समय चेतावनियों को नजरअंदाज करने के लिए यह विशेष रूप से उपयोगी है। का उपयोग करते हुए toxबताया PYTHONWARNINGS=ignoreकरने के लिए setenvबनाता है उत्पादन कम गंदा।
कर्ट बॉर्बकी

2
AWS सीएलआई के लिए भी बहुत उपयोगी है।
mckenzm

1
लेकिन यह डिप्रेशन चेतावनी को नजरअंदाज नहीं करता है। क्या मैं पूछ सकता हूं कि उसको कैसे शामिल किया जाए?
वी शी शी


70

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

import sys
import warnings

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

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


यह एकदम सही है क्योंकि यह बाद के निष्पादन में सभी चेतावनियों को अक्षम नहीं करेगा
ओरसीरिस डी जोंग

52

यदि आप कुछ जटिल नहीं चाहते हैं, तो:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

10
और चीजों को डिफ़ॉल्ट व्यवहार में वापस लाने के लिए:warnings.filterwarnings("default", category=FutureWarning)
हंस बुवेमेस्टर

17

यदि आप जानते हैं कि आमतौर पर आपके द्वारा किए जाने वाले बेकार चेतावनी क्या हैं, तो आप उन्हें संदेश द्वारा फ़िल्टर कर सकते हैं।

import warnings

#ignore by message
warnings.filterwarnings("ignore", message="divide by zero encountered in divide")

#part of the message is also okay
warnings.filterwarnings("ignore", message="divide by zero encountered") 
warnings.filterwarnings("ignore", message="invalid value encountered")

0

मुझे एहसास है कि यह केवल स्थितियों के एक आला पर लागू होता है, लेकिन एक numpyसंदर्भ में मैं वास्तव में उपयोग करना पसंद करता हूं np.errstate:

np.sqrt(-1)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan

हालांकि, का उपयोग कर np.errstate:

with np.errstate(invalid='ignore'):
    np.sqrt(-1)
nan

सबसे अच्छा हिस्सा आप इसे केवल कोड की बहुत विशिष्ट लाइनों पर लागू कर सकते हैं।


-5

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

यह विशेष रूप से एसएनआई वगैरह को शामिल करने वाली क्रिप्टोग्राफी के लिए सही है। एक HTTPS हैंडलिंग के लिए 2.6 अपडेट कर सकते हैं: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

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

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


4
जवाब देने में व़क्त लेने के लिए शुक्रिया। कृपया विषय पर कड़ाई से उत्तर दें, हालांकि: आप कुछ ऐसी चीजों का उल्लेख करते हैं, जो सवाल के लिए अप्रासंगिक हैं क्योंकि यह वर्तमान में खड़ा है, जैसे कि CentOS, Python 2.6, क्रिप्टोग्राफी, urllib, बैक-पोर्टिंग। आप उन बिट्स को हटाने के लिए अपने प्रश्न को संपादित कर सकते हैं। यदि आप ओपी से अधिक विवरण जानना चाहते हैं, तो प्रश्न के बजाय एक टिप्पणी छोड़ दें।
फ्रेंडएफएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.