2013-01-22 20 views
152

Sto lavorando con il codice con molti avvisi inutili (per il momento al momento) usando la libreria warnings. Leggendo (/ scansione) la documentazione ho trovato solo un modo to disable warnings for single functions. Ma non voglio cambiare molto del codice.Come disabilitare gli avvisi python

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

Cosa raccomanderesti?

+4

Perché si desidera disattivare gli avvisi? Non risolvere/risolvere i problemi sarebbe meglio a breve + lungo termine? Gli avvertimenti vengono solitamente sollevati per una ragione, ignorarli/metterli a tacere porteranno probabilmente a problemi più grandi in futuro. –

+5

Hai perfettamente ragione, ti ho dato un +1 per il tuo commento, ma ci sono come ho scritto "al momento" inutile per me. – Framester

+5

@MartinSamson Sono generalmente d'accordo, ma ci sono casi legittimi per ignorare gli avvertimenti. Ottengo molti di questi utilizzando la sintassi Xpath valida in defusedxml: 'FutureWarning: questa ricerca è stata interrotta in 1.3 e precedenti e verrà risolta in una versione futura. Se ti affidi al comportamento attuale, cambialo in [quest'altra cosa] '. Preferirei ignorare gli avvertimenti ora e aspettare che venga risolto in silenzio che scrivere codice inutilmente brutto solo per evitare un avvertimento innocuo. – Pedro

risposta

162

C'è lo -W option.

python -W ignore foo.py

213

hai guardato la sezione suppress warnings dei documenti pitone?

Se si utilizza il codice che si sa sarà sollevare un avvertimento, come ad esempio una funzione di deprecato, ma non si vuole vedere l'avviso, allora è possibile eliminare l'avviso utilizzando il gestore catch_warnings contesto:

import warnings 

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

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

non giustifico, ma si può solo surpress tutte le avvertenze con questo:

import warnings 
warnings.filterwarnings("ignore") 

Es:

>>> 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

Quindi devi avvolgere il codice in ogni file con un 'con warnings.catch_warnings():'? – Framester

+7

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

46

Si può anche definire una variabile d'ambiente (nuova funzione nel 2010 - vale a dire pitone 2,7)

export PYTHONWARNINGS="ignore" 

test come questo: predefinito

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

Ignorare avvertimenti

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

FWIW "nuova funzionalità nel 2010" significa che questo funziona per Python 2.7 ma non per 2.6 o versioni precedenti 2.x. (Dovevo andare a cercarlo, ho ancora Python 2.6 in produzione ...) –

+2

Giusto. Python 2.7 point added –

+1

Ciò è particolarmente utile per ignorare gli avvertimenti durante l'esecuzione dei test. Usando 'tox', aggiungendo' PYTHONWARNINGS = ignore' a 'setenv' rende l'output meno sporco. –

2

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

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

l'avviso è ancora attivo, ma tutto ciò che si desidera è backportato. il reindirizzamento di stderr ti lascerà con un output di terminale/shell pulito anche se il contenuto dello stdout stesso non cambia.

rispondere a FriendFX. la frase uno (1) risponde direttamente al problema con una soluzione universale. la seconda frase (2) tiene conto dell'ancoraggio citato re 'disable warnings' che è specifico per python 2.6 e osserva che gli utenti di RHEL/centos 6 non possono fare direttamente senza 2.6. anche se non sono state citate avvertenze specifiche, para 2 (2) risponde alla domanda 2.6 Ricevo più spesso le correzioni nel modulo di crittografia e come si può "modernizzare" (cioè aggiornare, backport, correggere) le prestazioni HTTPS/TLS di python . il paragrafo tre (3) spiega semplicemente il risultato dell'uso del reindirizzamento e dell'aggiornamento del modulo/delle dipendenze.

+2

Grazie per aver trovato il tempo di rispondere. Per favore, tieni le risposte rigorosamente sull'argomento: parli di alcune cose che sono irrilevanti per la domanda così com'è attualmente, come CentOS, Python 2.6, crittografia, urllib, back-porting. Puoi modificare la tua domanda per rimuovere quei bit. Se vuoi conoscere maggiori dettagli dall'OP, lascia un commento sotto la domanda. – FriendFX

4

Questa è una vecchia questione, ma v'è qualche indicazione più recente in PEP 565 che per spegnere tutti gli avvisi se si sta scrivendo un'applicazione di pitone si dovrebbe usare:

import sys 
import warnings 

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

La ragione per questo è consigliata è che disattiva tutti gli avvisi di default ma in modo cruciale consente loro di essere riaccesi tramite python -W sulla riga di comando o PYTHONWARNINGS.

Problemi correlati