web-dev-qa-db-fra.com

Comment désactiver les avertissements python

Je travaille avec du code qui jette beaucoup (pour moi en ce moment) des avertissements inutiles en utilisant la bibliothèque warnings . En lisant (/ parcourant) la documentation, je n’ai trouvé que le moyen pour désactiver les avertissements pour les fonctions uniques . Mais je ne veux pas changer autant de code.

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

Que recommanderais-tu?

315
Framester

Il y a le - option W .

python -W ignore foo.py

309
Pavel Anossov

Avez-vous regardé la section supprimer les avertissements de la documentation python?

Si vous utilisez du code que vous savez déclencher un avertissement, tel qu'une fonction obsolète, mais que vous ne souhaitez pas voir l'avertissement, vous pouvez alors le supprimer à 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 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
419
Mike

Vous pouvez également définir une variable d’environnement (nouvelle fonctionnalité en 2010 - c.-à-d. 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
>>>

Ignore avertissements

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

C'est une vieille question, mais PEP 565 indique 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")

Cela est recommandé par le fait que tous les avertissements sont désactivés par défaut, mais leur permet de pouvoir être réactivés via python -W sur la ligne de commande ou PYTHONWARNINGS.

54
Chris_Rands

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

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

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")
1
user3226167

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 à la limite 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 de terminal/shell propre bien que le contenu de stdout ne change pas lui-même.

répondant à FriendFX. La phrase 1 (1) répond directement au problème par 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 particulier n'ait été cité, le paragraphe deux (2) répond à la question 2.6, ce qui m'amène le plus souvent aux lacunes du module de cryptographie et à la façon de "moderniser" (c'est-à-dire, mettre à niveau, sauvegarder, corriger) les performances HTTPS/TLS de python. . Le paragraphe 3 (3) explique simplement le résultat de l'utilisation de la réorientation directe et de la mise à niveau du module/des dépendances.

0
jvp