Comment ignorer les avertissements d'obsolescence en Python

176

Je continue de recevoir ceci:

DeprecationWarning: integer argument expected, got float

Comment faire disparaître ce message? Existe-t-il un moyen d'éviter les avertissements en Python?

Mohammed
la source

Réponses:

121

De la documentation du warningsmodule :

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

Si vous êtes sous Windows: passez -W ignore::DeprecationWarningen argument à Python. Mieux vaut cependant résoudre le problème, en castant en int .

(Notez que dans Python 3.2, les avertissements d'obsolescence sont ignorés par défaut.)

Stephan202
la source
8
J'aimerais pouvoir faire ce travail ... J'obtiens une /usr/bin/env: python -W ignore::DeprecationWarning: No such file or directoryerreur. Cela fonctionne si j'exécute python avec l' -W ignore::DeprecationWarningoption sur la ligne de commande, mais / usr / bin / env ne le gère pas.
weronika
4
Semble être une solution Windows uniquement.
Daniel Miles
15
Vous pouvez définir la variable d'environnement PYTHONWARNINGS cela a fonctionné pour moi export PYTHONWARNINGS="ignore::DeprecationWarning:simplejson"pour désactiver les avertissements de dépréciation django json de sorl
yvess
@yvess, si c'était une réponse, j'aurais voté pour. Semble un moyen propre d'ignorer des avertissements spécifiques à l'échelle du système. Je l'ai mis dans mon ~ / .profile. Fonctionne très bien.
allanberry
Salut, pouvons-nous comment transformer ce message d'avertissement de dépréciation en un message d'informations de type. Ce que je voudrais, c'est simplement afficher le message sur la console pour ne pas être classé comme un type d'avertissement.
Krishna Oza
194

Vous devriez juste corriger votre code mais juste au cas où,

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning) 
ismail
la source
2
A travaillé pour moi en utilisant iPython
zbinsd
21
Cela ne fonctionne pas du tout pour moi, je vois toujours des avertissements de dépréciation.
user1244215
8
@ user1244215 Je peux me tromper, mais je pense qu'il importe où dans votre code vous exécutez warnings.filterwarnings("ignore", category=DeprecationWarning). Je pense que vous devez l'exécuter après avoir importé la bibliothèque qui crache les avertissements, même si je peux me tromper.
Jack Kelly
1
La catégorie @CodingYourLife est nécessaire afin que vous puissiez toujours voir d'autres types d'avertissements comme RuntimeWarning, etc.
ismail
1
Dans mon cas, le code à l'origine de l'avertissement était from xgboost import XGBClassifier. J'ai dû mettre warnings.filterwarnings("ignore", category=DeprecationWarning)immédiatement avant cette importation pour que cela fonctionne.
sedeh
193

J'avais ces:

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/persisted/sob.py:12:
DeprecationWarning: the md5 module is deprecated; use hashlib instead import os, md5, sys

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/python/filepath.py:12:
DeprecationWarning: the sha module is deprecated; use the hashlib module instead import sha

Corrigé avec:

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
Eddy Pronk
la source
2
Génial, merci beaucoup !! (Il m'a fallu un moment pour me rendre compte que je pouvais également envelopper des bits de code non importés, car certains paquets généraient également des DeprecationWarnings lorsqu'ils étaient utilisés après l'importation.) Très bonne façon de ne faire taire que des DeprecationWarnings spécifiques que j'ai déjà regardés et décidé Je veux ignorer.
weronika
29

J'ai trouvé le moyen le plus propre de le faire (en particulier sur Windows) en ajoutant ce qui suit à C: \ Python26 \ Lib \ site-packages \ sitecustomize.py:

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

Notez que j'ai dû créer ce fichier. Bien sûr, changez le chemin vers python si le vôtre est différent.

Tristan Havelick
la source
26

Aucune de ces réponses n'a fonctionné pour moi, je vais donc publier ma façon de résoudre ce problème. J'utilise le at the beginning of my main.pyscript suivant et cela fonctionne très bien.


Utilisez ce qui suit tel quel (copiez-collez-le):

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

Exemple:

import "blabla"
import "blabla"

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

# more code here...
# more code here...

seralouk
la source
4
Cela a fonctionné quand toutes les autres solutions n'ont pas fonctionné. Merci!
cxxl
Cela m'a sauvé aussi. Heureux que je puisse aider.
seralouk
Ne fonctionne pas dans la version 3.7.3 pour les avertissements d'obsolescence d'AstroPy. :(
ingyhere
A travaillé pour moi, merci :)
valkyrie55
bonne nouvelle ! cheers
seralouk
6

Passez les bons arguments? : P

Sur la note plus sérieuse, vous pouvez passer l'argument -Wi :: DeprecationWarning sur la ligne de commande à l'interpréteur pour ignorer les avertissements d'obsolescence.

timide
la source
5

Solution Docker

  • Désactivez TOUS les avertissements avant d'exécuter l'application python
    • Vous pouvez également désactiver vos tests dockérisés
ENV PYTHONWARNINGS="ignore::DeprecationWarning"
Marcello de Sales
la source
4

Convertissez l'argument en int. C'est aussi simple que

int(argument)
Gonzalo Quero
la source
4

Lorsque vous souhaitez ignorer les avertissements uniquement dans les fonctions, vous pouvez effectuer les opérations suivantes.

import warnings
from functools import wraps


def ignore_warnings(f):
    @wraps(f)
    def inner(*args, **kwargs):
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("ignore")
            response = f(*args, **kwargs)
        return response
    return inner

@ignore_warnings
def foo(arg1, arg2):
    ...
    write your code here without warnings
    ...

@ignore_warnings
def foo2(arg1, arg2, arg3):
    ...
    write your code here without warnings
    ...

Ajoutez simplement le décorateur @ignore_warnings sur la fonction que vous souhaitez ignorer tous les avertissements

Trideep Rath
la source
3

Essayez le code ci-dessous si vous utilisez Python3:

import sys

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

ou essayez ceci ...

import warnings

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

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

ou essayez ceci ...

import warnings
warnings.filterwarnings("ignore")
Amar Kumar
la source
2

Python 3

Écrivez simplement ci-dessous des lignes faciles à retenir avant d'écrire votre code:

import warnings

warnings.filterwarnings("ignore")
Dipen Gajjar
la source
0

Si vous savez ce que vous faites, une autre façon est simplement de trouver le fichier qui vous avertit (le chemin du fichier est indiqué dans les informations d'avertissement), de commenter les lignes qui génèrent les avertissements.

Statham
la source
0

Pour python 3, écrivez simplement les codes ci-dessous pour ignorer tous les avertissements.

from warnings import filterwarnings
filterwarnings("ignore")
Ashish Anand
la source
-2

Je ne veux pas vous en vouloir, mais vous êtes averti que ce que vous faites cessera probablement de fonctionner lors de la prochaine mise à niveau de python. Convertissez en int et en avez fini avec lui.

BTW. Vous pouvez également écrire votre propre gestionnaire d'avertissements. Attribuez simplement une fonction qui ne fait rien. Comment rediriger les avertissements python vers un flux personnalisé?

Joint
la source
4
Ce conseil ne fonctionne que s'il s'agit bien de son propre code et non d'un package tiers.
Christopher Barber