Comment désactiver les avertissements python

421

Je travaille avec du code qui lance beaucoup (pour moi en ce moment) d'avertissements inutiles en utilisant la warningsbibliothèque. En lisant (/ scannant) la documentation, je n'ai trouvé qu'un moyen de désactiver les avertissements pour les fonctions individuelles . Mais je ne veux pas changer autant de code.

Y a-t-il peut-être un drapeau comme python -no-warning foo.py?

Que recommanderais-tu?

Framester
la source
9
@MartinSamson Je suis généralement d'accord, mais il existe des cas légitimes pour ignorer les avertissements. Je reçois plusieurs de ces d'utiliser la syntaxe XPath valide dans 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]. Je préfère ignorer les avertissements maintenant et attendre qu'il soit corrigé en silence que d'écrire du code inutilement laid juste pour éviter un avertissement inoffensif.
Pedro
1
désactiver des avertissements spécifiques: stackoverflow.com/questions/9134795/…
user3226167

Réponses:

397

Il y a l' option -W .

python -W ignore foo.py

Pavel Anossov
la source
7
Ne fonctionne pas sur Ubuntu
parsecer
1
Êtes-vous sûr ? Cela fonctionne pour moi sur un serveur Ubuntu 18.04. Utilisation de python 3.5 btw.
Florent F
576

Avez-vous regardé la section supprimer les avertissements des documents python?

Si vous utilisez du code dont vous savez qu'il déclenchera un avertissement, comme une fonction obsolète, mais que vous ne souhaitez pas voir l'avertissement, il est possible de supprimer l'avertissement à l'aide du gestionnaire de contexte catch_warnings:

import warnings

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

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

Je ne l'approuve pas, mais vous pouvez simplement supprimer tous les avertissements avec ceci:

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
la source
12
@Framester - oui, OMI, c'est le moyen le plus propre de supprimer des avertissements spécifiques, les avertissements sont là en général parce que quelque chose pourrait ne pas bien, donc supprimer tous les avertissements via la ligne de commande pourrait ne pas être le meilleur pari.
Mike
1
@Framester - J'ai également énuméré l'autre option avec un exemple ... Je ne l'aime pas autant (pour la raison que j'ai donnée dans le commentaire précédent) mais au moins maintenant vous avez les outils.
Mike
41
Si vous vous attendez uniquement à intercepter les avertissements d'une catégorie spécifique, vous pouvez le passer en utilisant l' categoryargument:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach
1
C'est utile pour moi dans ce cas car html5lib crache des avertissements lxml même s'il n'analyse pas xml. Merci
jamescampbell
5
Il y a aussi un paramètre utile pour la warnings.filterwarnings fonction: module. Il vous permet d'ignorer les avertissements du module spécifié.
nom d'utilisateur
105

Vous pouvez également définir une variable d'environnement (nouvelle fonctionnalité en 2010 - c'est-à-dire python 2.7)

export PYTHONWARNINGS="ignore"

Testez comme ceci: Par défaut

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

Ignorer les avertissements

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

Pour les avertissements de dépréciation, regardez comment ignorer les avertissements de dépréciation en python

Copié ici ...

De la documentation du warningsmodule :

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

Si vous êtes sous Windows: passez -W ignore::DeprecationWarningcomme argument à Python. Mieux encore pour résoudre le problème, en effectuant un cast vers int .

(Notez que dans Python 3.2, les avertissements de dépréciation sont ignorés par défaut.)

Ou:

import warnings

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

yourcode()

Maintenant, vous obtenez toujours tous les autres DeprecationWarning, mais pas ceux causés par:

import md5, sha
Holger Bille
la source
2
Ceci est particulièrement utile pour ignorer les avertissements lors des tests. Utiliser tox, ajouter PYTHONWARNINGS=ignoreà setenvrend la sortie moins sale.
Kurt Bourbaki
2
Très utile également pour AWS CLI.
mckenzm
1
Mais cela n'ignore pas l'avertissement de dépréciation. Puis-je demander comment l'inclure?
Wey Shi
@Wey Shi, jetez un œil à stackoverflow.com/questions/879173/…
Holger Bille
70

C'est une vieille question, mais il y a des instructions plus récentes dans PEP 565 pour désactiver tous les avertissements si vous écrivez une application python, vous devez utiliser:

import sys
import warnings

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

La raison pour laquelle cela est recommandé est qu'il désactive tous les avertissements par défaut mais permet de les réactiver via via python -Wla ligne de commande ou PYTHONWARNINGS.

Chris_Rands
la source
C'est parfait car il ne désactivera pas tous les avertissements lors d'une exécution ultérieure
Orsiris de Jong
53

Si vous ne voulez pas quelque chose de compliqué, alors:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
Abhishek Jain
la source
10
Et pour ramener les choses au comportement par défaut:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester
17

Si vous savez quels sont les avertissements inutiles que vous rencontrez habituellement, vous pouvez les filtrer par message.

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
la source
0

Je me rends compte que cela ne s'applique qu'à une niche des situations, mais dans un numpycontexte que j'aime vraiment utiliser np.errstate:

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

Cependant, en utilisant np.errstate:

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

La meilleure partie étant que vous ne pouvez l'appliquer qu'à des lignes de code très spécifiques.

jorijnsmit
la source
-5

les avertissements sont générés via stderr et la solution simple consiste à ajouter «2> / dev / null» à la CLI. cela a beaucoup de sens pour de nombreux utilisateurs tels que ceux avec centos 6 qui sont bloqués avec des dépendances python 2.6 (comme yum) et divers modules sont poussés au bord de l'extinction dans leur couverture.

cela est particulièrement vrai pour la cryptographie impliquant SNI et cetera. on peut mettre à jour 2.6 pour la gestion HTTPS en utilisant le proc à: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

l'avertissement est toujours en place, mais tout ce que vous voulez est rétroporté. la redirection de stderr vous laissera une sortie terminal / shell propre bien que le contenu stdout lui-même ne change pas.

répondre à FriendFX. phrase un (1) répond directement au problème avec une solution universelle. la phrase deux (2) prend en compte l'ancre citée concernant «désactiver les avertissements» qui est spécifique à python 2.6 et note que les utilisateurs de RHEL / centos 6 ne peuvent pas se passer directement de 2.6. bien qu'aucun avertissement spécifique n'ait été cité, le paragraphe deux (2) répond à la question 2.6 que je reçois le plus souvent concernant les lacunes du module de cryptographie et comment on peut "moderniser" (c.-à-d., mettre à niveau, rétroporter, corriger) les performances HTTPS / TLS de python . le paragraphe trois (3) explique simplement le résultat de l'utilisation de la redirection et de la mise à niveau du module / des dépendances.

jvp
la source
4
Merci d'avoir pris le temps de répondre. Veuillez cependant garder les réponses strictement sur le sujet: vous mentionnez un certain nombre de choses qui ne sont pas pertinentes pour la question telle qu'elle est actuellement, telles que CentOS, Python 2.6, la cryptographie, l'urllib, le portage arrière. Vous pouvez modifier votre question pour supprimer ces bits. Si vous souhaitez en savoir plus sur le PO, laissez plutôt un commentaire sous la question.
FriendFX