Cómo deshabilitar las advertencias de Python

421

Estoy trabajando con un código que arroja muchas (para mí en este momento) advertencias inútiles usando la warningsbiblioteca. Leyendo (/ escaneando) la documentación, solo encontré una manera de desactivar las advertencias para funciones individuales . Pero no quiero cambiar tanto el código.

¿Tal vez hay una bandera como python -no-warning foo.py?

¿Qué recomendarías?

Framester
fuente
99
@ MartinSamson Generalmente estoy de acuerdo, pero hay casos legítimos para ignorar las advertencias. Consigo varios de ellos el uso de la sintaxis XPath válida en 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]. Prefiero ignorar las advertencias ahora y esperar a que se solucione en silencio que escribir código innecesariamente feo solo para evitar una advertencia inofensiva.
Pedro
1
deshabilitar advertencias específicas: stackoverflow.com/questions/9134795/…
user3226167

Respuestas:

397

Existe la opción -W .

python -W ignore foo.py

Pavel Anossov
fuente
77
No funciona en Ubuntu
analizador el
1
Estás seguro ? Funciona para mí en un servidor ubuntu 18.04. Usando python 3.5 por cierto.
Florent F
576

¿ Viste la sección de advertencias de supresión de los documentos de Python?

Si está utilizando un código que sabe que generará una advertencia, como una función obsoleta, pero no desea ver la advertencia, entonces es posible suprimir la advertencia utilizando el administrador de contexto catch_warnings:

import warnings

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

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

No lo apruebo, pero podría suprimir todas las advertencias con esto:

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
Miguel
fuente
12
@Framester: sí, en mi opinión, esta es la forma más limpia de suprimir advertencias específicas, las advertencias existen en general porque algo podría estar mal, por lo que suprimir todas las advertencias a través de la línea de comando podría no ser la mejor opción.
Mike
1
@Framester: también enumeré la otra opción con un ejemplo ... No me gusta tanto (por la razón que di en el comentario anterior), pero al menos ahora tiene las herramientas.
Mike
41
Si solo espera captar advertencias de una categoría específica, puede pasarla usando el categoryargumento:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach
1
Esto es útil para mí en este caso porque html5lib escupe advertencias lxml a pesar de que no está analizando xml. Gracias
jamescampbell
55
Hay también un parámetro útil para la warnings.filterwarnings función: module. Le permite ignorar las advertencias del módulo especificado.
nombre de usuario
104

También puede definir una variable de entorno (nueva característica en 2010, es decir, Python 2.7)

export PYTHONWARNINGS="ignore"

Prueba como esta: Predeterminado

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

Ignorar advertencias

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

Para advertencias de desaprobación, eche un vistazo a cómo-ignorar-advertencias-desaprobación-en-python

Copiado aquí ...

De la documentación del warningsmódulo :

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

Si estás en Windows: pasa -W ignore::DeprecationWarningcomo argumento a Python. Sin embargo, es mejor resolver el problema enviando a int .

(Tenga en cuenta que en Python 3.2, las advertencias de desaprobación se ignoran de forma predeterminada).

O:

import warnings

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

yourcode()

Ahora todavía obtienes todos los otros DeprecationWarnings, pero no los causados ​​por:

import md5, sha
Holger Bille
fuente
2
Esto es especialmente útil para ignorar las advertencias al realizar pruebas. Usando tox, agregando PYTHONWARNINGS=ignorea setenvhace que la salida sea menos sucia.
Kurt Bourbaki el
2
Muy útil para AWS CLI también.
mckenzm
1
Pero esto no ignora la advertencia de desaprobación. ¿Puedo preguntar cómo incluir ese?
Wey Shi
@Wey Shi, eche un vistazo a stackoverflow.com/questions/879173/…
Holger Bille el
70

Esta es una vieja pregunta, pero hay una nueva guía en PEP 565 que para desactivar todas las advertencias si está escribiendo una aplicación de Python, debe usar:

import sys
import warnings

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

La razón por la que se recomienda esto es que desactiva todas las advertencias de manera predeterminada, pero permite que se vuelvan a activar python -Wen la línea de comandos o PYTHONWARNINGS.

Chris_Rands
fuente
Esto es perfecto ya que no deshabilitará todas las advertencias en una ejecución posterior
Orsiris de Jong
53

Si no quieres algo complicado, entonces:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
Abhishek Jain
fuente
10
Y para volver las cosas al comportamiento predeterminado:warnings.filterwarnings("default", category=FutureWarning)
Hans Bouwmeester
17

Si sabe cuáles son las advertencias inútiles que suele encontrar, puede filtrarlas por mensaje.

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")
usuario3226167
fuente
0

Me doy cuenta de que esto solo es aplicable a un nicho de las situaciones, pero dentro de un numpycontexto que realmente me gusta usar np.errstate:

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

Sin embargo, usando np.errstate:

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

La mejor parte es que puede aplicar esto solo a líneas de código muy específicas.

jorijnsmit
fuente
-5

Las advertencias se envían a través de stderr y la solución simple es agregar '2> / dev / null' a la CLI. Esto tiene mucho sentido para muchos usuarios, como aquellos con centos 6 que están atrapados con las dependencias de Python 2.6 (como yum) y varios módulos están siendo empujados al borde de la extinción en su cobertura.

Esto es especialmente cierto para la criptografía que involucra SNI, etc. se puede actualizar 2.6 para el manejo de HTTPS utilizando el proceso en: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

la advertencia todavía está en su lugar, pero todo lo que desea se transfiere. la redirección de stderr te dejará con una salida de terminal / shell limpia, aunque el contenido stdout en sí no cambia.

respondiendo a FriendFX. la oración uno (1) responde directamente al problema con una solución universal. la oración dos (2) toma en cuenta el ancla citada sobre 'deshabilitar advertencias' que es específica de Python 2.6 y señala que los usuarios de RHEL / centos 6 no pueden prescindir directamente de 2.6. aunque no se citaron advertencias específicas, el párrafo dos (2) responde a la pregunta 2.6 que recibo con más frecuencia sobre las deficiencias en el módulo de criptografía y cómo se puede "modernizar" (es decir, actualizar, backport, corregir) el rendimiento HTTPS / TLS de Python . el párrafo tres (3) simplemente explica el resultado del uso del redireccionamiento y la actualización del módulo / dependencias.

jvp
fuente
44
Gracias por tomarte el tiempo de responder. Sin embargo, mantenga las respuestas estrictamente sobre el tema: menciona algunas cosas que son irrelevantes para la pregunta tal como está actualmente, como CentOS, Python 2.6, la criptografía, el urllib, el back-port. Puede editar su pregunta para eliminar esos bits. Si desea conocer más detalles del OP, deje un comentario debajo de la pregunta.
FriendFX