Come disabilitare gli avvisi di Python


421

Sto lavorando con un codice che genera molti (per me al momento) avvisi inutili usando la warningslibreria. Leggendo (/ scansionando) la documentazione ho trovato solo un modo per disabilitare gli avvisi per singole funzioni . Ma non voglio cambiare molto del codice.

C'è forse una bandiera come python -no-warning foo.py?

Cosa raccomanderesti?


9
@MartinSamson Sono generalmente d'accordo, ma ci sono casi legittimi per ignorare gli avvisi. Ottengo molti di questi di utilizzare la sintassi XPath valido defusedxml: 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]. Preferirei ignorare gli avvisi ora e aspettare che venga riparato silenziosamente piuttosto che scrivere un codice inutilmente brutto solo per evitare un avviso innocuo.
Pedro,

1
disattivare le avvertenze specifiche: stackoverflow.com/questions/9134795/...
user3226167

Risposte:



576

Hai dato un'occhiata alla sezione degli avvisi di soppressione dei documenti di Python?

Se stai usando un codice che sai genererà un avviso, come una funzione obsoleta, ma non vuoi vedere l'avviso, è possibile sopprimere l'avviso usando il gestore di contesto catch_warnings:

import warnings

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

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

Non lo perdono, ma potresti semplicemente sopprimere tutti gli avvisi con questo:

import warnings
warnings.filterwarnings("ignore")

Ex:

>>> 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 - sì, IMO questo è il modo più pulito per sopprimere gli avvisi specifici, gli avvisi sono in generale perché qualcosa potrebbe essere sbagliato, quindi sopprimere tutti gli avvisi tramite la riga di comando potrebbe non essere la scommessa migliore.
Mike,

1
@Framester - Ho elencato anche l'altra opzione con un esempio ... Non mi piace tanto (per la ragione che ho dato nel commento precedente) ma almeno ora hai gli strumenti.
Mike,

41
Se prevedi solo di ricevere avvisi da una categoria specifica, puoi passarli usando l' categoryargomento:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
Questo è utile per me in questo caso perché html5lib emette avvisi lxml anche se non sta analizzando xml. Grazie
jamescampbell,

5
C'è anche un parametro utile per la warnings.filterwarnings funzione di: module. Ti consente di ignorare gli avvisi dal modulo specificato.
nome utente

104

È inoltre possibile definire una variabile di ambiente (nuova funzionalità nel 2010, ad esempio python 2.7)

export PYTHONWARNINGS="ignore"

Prova in questo modo: impostazione predefinita

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

Ignora gli avvisi

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

Per gli avvisi di deprecazione dai un'occhiata a come-ignorare-avvertimenti di deprecazione-in-pitone

Copiato qui ...

Dalla documentazione del warningsmodulo :

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

Se sei su Windows: passa -W ignore::DeprecationWarningcome argomento a Python. Meglio però risolvere il problema, lanciando a int .

(Si noti che in Python 3.2, gli avvisi di deprecazione vengono ignorati per impostazione predefinita.)

O:

import warnings

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

yourcode()

Ora ottieni ancora tutti gli altri DeprecationWarning, ma non quelli causati da:

import md5, sha

2
Ciò è particolarmente utile per ignorare gli avvisi durante l'esecuzione dei test. Usando tox, aggiungendo PYTHONWARNINGS=ignorea si setenvrende l'output meno sporco.
Kurt Bourbaki,

2
Molto utile anche per l'interfaccia della riga di comando di AWS.
mckenzm,

1
Ma questo non ignora l'avvertimento di deprecazione. Posso chiederti come includerlo?
Wey Shi,


70

Questa è una vecchia domanda ma ci sono alcune indicazioni più recenti in PEP 565 che per disattivare tutti gli avvisi se stai scrivendo un'applicazione Python dovresti usare:

import sys
import warnings

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

Il motivo per cui questo è raccomandato è che disattiva tutti gli avvisi per impostazione predefinita, ma soprattutto consente di riaccenderli python -Wdalla riga di comando o PYTHONWARNINGS.


Questo è perfetto poiché non disabiliterà tutti gli avvisi nella successiva esecuzione
Orsiris de Jong

53

Se non vuoi qualcosa di complicato, allora:

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

10
E per riportare le cose al comportamento predefinito:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester,

17

Se sai quali sono gli avvisi inutili che di solito incontri, puoi filtrarli per messaggio.

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

Mi rendo conto che questo è applicabile solo a una nicchia delle situazioni, ma in un numpycontesto mi piace molto usare np.errstate:

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

Tuttavia, utilizzando np.errstate:

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

La parte migliore è che puoi applicarlo solo a righe di codice molto specifiche.


-5

gli avvisi vengono emessi tramite stderr e la soluzione semplice è aggiungere '2> / dev / null' alla CLI. questo ha molto senso per molti utenti come quelli con centos 6 che sono bloccati con dipendenze di Python 2.6 (come yum) e vari moduli vengono spinti al limite dell'estinzione nella loro copertura.

questo è particolarmente vero per la crittografia che coinvolge SNI et cetera. si può aggiornare 2.6 per la gestione HTTPS usando il proc a: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

l'avviso è ancora attivo, ma tutto ciò che desideri è trasferito indietro. il re-direct di stderr ti lascerà con un output pulito di terminale / shell sebbene il contenuto stdout stesso non cambi.

rispondendo a FriendFX. la frase uno (1) risponde direttamente al problema con una soluzione universale. la frase due (2) prende in considerazione l'ancoraggio citato re 'disabilita gli avvertimenti' che è specifico di Python 2.6 e nota che gli utenti RHEL / centos 6 non possono farne a meno direttamente 2.6. sebbene non siano stati citati avvertimenti specifici, il paragrafo due (2) risponde alla domanda 2.6. Più frequentemente ricevo le carenze del modulo di crittografia e come si possono "modernizzare" (ad es. aggiornamento, backport, correzione) le prestazioni HTTPS / TLS di Python . il terzo paragrafo (3) spiega semplicemente il risultato dell'uso del reindirizzamento e dell'aggiornamento del modulo / delle dipendenze.


4
Grazie per il tempo dedicato a rispondere. Per favore, mantieni le risposte rigorosamente sull'argomento: menzioni alcune cose che sono irrilevanti per la domanda così com'è attualmente, come CentOS, Python 2.6, crittografia, urllib, back-porting. È possibile modificare la domanda per rimuovere quei bit. Se vuoi conoscere maggiori dettagli dall'OP, lascia un commento sotto la domanda.
FriendFX,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.