Comment désactiver les Avertissements python

Je travaille avec du code avec beaucoup de lancers (pour moi en ce moment) d'Avertissements inutiles en utilisant le warnings bibliothèque. En lisant (/scannant) la documentation, j'ai seulement trouvé un moyen de désactiver les avertissements pour les fonctions uniques . Mais je ne veux pas changer autant de code.

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

Que recommanderiez-vous?

211
demandé sur Chris Seymour 2013-01-22 20:26:49

6 réponses

Il y a l'option -W .

python -W ignore foo.py

220
répondu Pavel Anossov 2013-01-22 16:28:31

Avez-vous regardé la section suppress warnings 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 voulez 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 le tolère pas, mais vous pourriez simplement surpasser 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
277
répondu Mike 2017-10-15 15:24:29

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 avertissements

$ export PYTHONWARNINGS="ignore"
$ python
>>> import warnings
>>> warnings.warn('my warning')
>>> 
57
répondu Holger Bille 2015-02-24 15:26:07

C'est une vieille question mais il y a des conseils plus récents dans pep 565 que 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 surtout permet de les réactiver via python -W sur la ligne de commande ou PYTHONWARNINGS.

22
répondu Chris_Rands 2018-02-06 21:00:29

Les Avertissements sont émis via stderr et la solution simple consiste à ajouter '2 > / dev / null' à L'interface de ligne de commande. 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 avec une sortie terminal/shell propre bien que le contenu de stdout lui-même ne change pas.

Répondre à FriendFX. la première phrase (1) répond directement au problème avec une solution universelle. la deuxième phrase (2) prend en compte l'ancre Citée re 'disable warnings' qui est python 2.6 spécifique et note que les utilisateurs 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 sur les lacunes dans le module de cryptographie et comment on peut "moderniser" (c'est-à-dire mettre à niveau, rétroporter, réparer) 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.

1
répondu jvp 2017-01-25 00:58:38

Vous pouvez utiliser ce code en haut de main.py:

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn
0
répondu ykpgrr 2018-08-13 11:22:43