So deaktivieren Sie Python-Warnungen

419

Ich arbeite mit Code, der (für mich im Moment) viele nutzlose Warnungen über die warningsBibliothek auslöst. Beim Lesen (/ Scannen) der Dokumentation habe ich nur eine Möglichkeit gefunden , Warnungen für einzelne Funktionen zu deaktivieren . Aber ich möchte nicht so viel am Code ändern.

Gibt es vielleicht eine Flagge wie python -no-warning foo.py?

Was würden Sie empfehlen?

Framester
quelle
9
@ MartinSamson Ich stimme im Allgemeinen zu, aber es gibt legitime Fälle, in denen Warnungen ignoriert werden. Ich bekomme mehrere davon, wenn ich die gültige Xpath-Syntax in defusedxml verwende : 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]. Ich würde die Warnungen jetzt lieber ignorieren und darauf warten, dass sie stillschweigend behoben werden, als unnötig hässlichen Code zu schreiben, nur um eine harmlose Warnung zu vermeiden.
Pedro
1
Deaktivieren Sie bestimmte Warnungen: stackoverflow.com/questions/9134795/…
user3226167

Antworten:

396

Es gibt die Option -W .

python -W ignore foo.py

Pavel Anossov
quelle
7
Funktioniert nicht auf Ubuntu
Parsecer
1
Bist du sicher ? Es funktioniert für mich auf einem Ubuntu 18.04 Server. Mit Python 3.5 übrigens.
Florent F
576

Haben Sie sich den Abschnitt " Warnungen unterdrücken " in den Python-Dokumenten angesehen?

Wenn Sie Code verwenden, von dem Sie wissen, dass er eine Warnung auslöst, z. B. eine veraltete Funktion, die Warnung jedoch nicht angezeigt werden soll, können Sie die Warnung mithilfe des Kontextmanagers catch_warnings unterdrücken:

import warnings

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

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

Ich kann es nicht gutheißen, aber Sie könnten einfach alle Warnungen damit unterdrücken :

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
Mike
quelle
12
@Framester - Ja, IMO, dies ist der sauberste Weg, um bestimmte Warnungen zu unterdrücken. Warnungen sind im Allgemeinen vorhanden, da möglicherweise etwas nicht stimmt. Daher ist es möglicherweise nicht die beste Wahl, alle Warnungen über die Befehlszeile zu unterdrücken.
Mike
1
@Framester - Ich habe die andere Option auch mit einem Beispiel aufgelistet ... Ich mag sie nicht so sehr (aus dem Grund, den ich im vorherigen Kommentar angegeben habe), aber zumindest haben Sie jetzt die Tools.
Mike
41
Wenn Sie nur damit rechnen, Warnungen aus einer bestimmten Kategorie categorywarnings.filterwarnings("ignore", category=DeprecationWarning)
abzufangen
1
Dies ist in diesem Fall für mich nützlich, da html5lib lxml-Warnungen ausspuckt, obwohl xml nicht analysiert wird. Danke
Jamescampbell
5
Es gibt auch einen nützlichen Parameter für die warnings.filterwarnings Funktion : module. Sie können Warnungen des angegebenen Moduls ignorieren.
Benutzername
103

Sie können auch eine Umgebungsvariable definieren (neue Funktion in 2010 - dh Python 2.7)

export PYTHONWARNINGS="ignore"

Test wie folgt : Standard

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

Warnungen ignorieren

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

Für deprecation Warnungen einen Blick auf haben , wie zu ignorieren-deprecation-Warnungen-in-Python

Hier kopiert ...

Aus der Dokumentation des warningsModuls :

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

Wenn Sie unter Windows arbeiten: Übergeben Sie -W ignore::DeprecationWarningals Argument an Python. Besser, um das Problem zu lösen, indem Sie auf int umwandeln .

(Beachten Sie, dass in Python 3.2 Verfallswarnungen standardmäßig ignoriert werden.)

Oder:

import warnings

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

yourcode()

Jetzt bekommen Sie immer noch alle anderen DeprecationWarnings, aber nicht die, die verursacht werden durch:

import md5, sha
Holger Bille
quelle
2
Dies ist besonders nützlich, um Warnungen bei der Durchführung von Tests zu ignorieren. Durch Verwenden von tox, Hinzufügen PYTHONWARNINGS=ignorezu wird setenvdie Ausgabe weniger verschmutzt.
Kurt Bourbaki
2
Sehr nützlich auch für AWS CLI.
McKenzm
1
Dies ignoriert jedoch nicht die Abwertungswarnung. Darf ich fragen, wie ich das aufnehmen soll?
Wey Shi
@Wey Shi, werfen Sie
Holger Bille
70

Dies ist eine alte Frage, aber es gibt einige neuere Anleitungen in PEP 565 , nach denen Sie alle Warnungen deaktivieren sollten, wenn Sie eine Python-Anwendung schreiben:

import sys
import warnings

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

Der Grund dafür wird empfohlen, dass alle Warnungen standardmäßig deaktiviert werden, sie jedoch entscheidend über python -Wdie Befehlszeile oder wieder eingeschaltet werden können PYTHONWARNINGS.

Chris_Rands
quelle
Dies ist perfekt, da nicht alle Warnungen bei einer späteren Ausführung deaktiviert werden
Orsiris de Jong,
52

Wenn Sie nichts Kompliziertes wollen, dann:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
Abhishek Jain
quelle
10
Und um die Dinge wieder auf das Standardverhalten zurückzusetzen:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester
17

Wenn Sie wissen, auf welche nutzlosen Warnungen Sie normalerweise stoßen, können Sie sie nach Nachrichten filtern.

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")
user3226167
quelle
0

Mir ist klar, dass dies nur für eine Nische der Situationen gilt, aber in einem numpyKontext, den ich wirklich gerne benutze np.errstate:

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

Verwenden Sie jedoch np.errstate:

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

Das Beste daran ist, dass Sie dies nur auf ganz bestimmte Codezeilen anwenden können.

jorijnsmit
quelle
-5

Warnungen werden über stderr ausgegeben und die einfache Lösung besteht darin, '2> / dev / null' an die CLI anzuhängen. Dies ist für viele Benutzer sehr sinnvoll, z. B. für Benutzer mit Centos 6, die mit Python 2.6-Abhängigkeiten (wie yum) konfrontiert sind, und für verschiedene Module, die in ihrer Abdeckung an den Rand des Aussterbens geraten.

Dies gilt insbesondere für die Kryptographie mit SNI usw. Sie können 2.6 für die HTTPS-Behandlung mithilfe des Prozesses unter https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2 aktualisieren

Die Warnung ist noch vorhanden, aber alles, was Sie möchten, wird zurückportiert. Durch die Umleitung von stderr erhalten Sie eine saubere Terminal- / Shell-Ausgabe, obwohl sich der stdout-Inhalt selbst nicht ändert.

auf FriendFX antworten. Satz eins (1) reagiert direkt auf das Problem mit einer universellen Lösung. Satz zwei (2) berücksichtigt den zitierten Anker bezüglich "Warnungen deaktivieren", der Python 2.6-spezifisch ist, und stellt fest, dass RHEL / Centos 6-Benutzer nicht direkt auf 2.6 verzichten können. Obwohl keine spezifischen Warnungen angeführt wurden, beantwortet Absatz 2 (2) die Frage 2.6, die ich am häufigsten zu den Mängeln im Kryptografiemodul bekomme und wie man die HTTPS / TLS-Leistung von Python "modernisieren" (dh aktualisieren, backportieren, reparieren) kann . In Absatz 3 (3) wird lediglich das Ergebnis der Umleitung und Aktualisierung des Moduls / der Abhängigkeiten erläutert.

jvp
quelle
4
Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten. Bitte halten Sie die Antworten jedoch streng themenbezogen: Sie erwähnen einige Dinge, die für die derzeitige Frage irrelevant sind, wie CentOS, Python 2.6, Kryptographie, Urllib und Backporting. Sie können Ihre Frage bearbeiten, um diese Bits zu entfernen. Wenn Sie weitere Details aus dem OP erfahren möchten, hinterlassen Sie stattdessen einen Kommentar unter der Frage.
FriendFX