Как отключить предупреждения Python

Я работаю с кодом с большим количеством (для меня на данный момент) бесполезных предупреждений, используя warnings библиотека. Читая (/ сканируя) документацию, я нашел только способ отключить предупреждения для отдельных функций. Но я не хочу так сильно менять код.

Может быть, есть флаг, как python -no-warning foo.py?

Чтобы вы посоветовали?

16 ответов

Решение

Есть опция -W.

python -W ignore foo.py

Вы смотрели раздел подавления предупреждений в документации по Python?

Если вы используете код, который, как вы знаете, вызовет предупреждение, например устаревшую функцию, но не хочет видеть предупреждение, то можно отключить предупреждение с помощью диспетчера контекста catch_warnings:

import warnings

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

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

Я не оправдываю это, но вы могли бы просто прекратить все предупреждения с этим:

import warnings
warnings.filterwarnings("ignore")

Пример:

>>> 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

Чтобы не усложнять, просто используйте эти две строчки

      import warnings
warnings.filterwarnings('ignore')

Вы также можете определить переменную окружения (новая функция в 2010 году - т.е. Python 2.7)

export PYTHONWARNINGS="ignore"

Тест как это: по умолчанию

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

Игнорировать предупреждения

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

Если вы не хотите что-то сложное, то:

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

Когда ничего не помогает, используйте это: https://github.com/polvoazul/shutup

pip install shutup

затем добавьте в начало кода:

      import shutup; shutup.please()

Это старый вопрос, но в PEP 565 есть некоторые новые указания, что для отключения всех предупреждений, если вы пишете приложение на Python, вы должны использовать:

import sys
import warnings

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

Причина, по которой это рекомендуется, заключается в том, что по умолчанию все предупреждения отключаются, но, что крайне важно, их можно снова включить с помощью python -W в командной строке или PYTHONWARNINGS,

Если вы знаете, с какими бесполезными предупреждениями вы обычно сталкиваетесь, вы можете отфильтровать их по сообщениям.

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")
      import sys
if not sys.warnoptions:
    import warnings
    warnings.simplefilter("ignore")

Измените игнорирование на значение по умолчанию при работе с файлом или добавив новые функции для повторного включения предупреждений.

Я понимаю, что это применимо только к определенной нише ситуаций, но в пределах numpy контекст мне очень нравится использовать np.errstate:

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

Однако, используя np.errstate:

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

Самое приятное, что вы можете применить это только к очень конкретным строкам кода.


More pythonic way to ignore WARNINGS


Since 'warning.filterwarnings()' is not suppressing all the warnings, i will suggest you to use the following method:

      import logging
    
for name in logging.Logger.manager.loggerDict.keys():
    logging.getLogger(name).setLevel(logging.CRITICAL)

#rest of the code starts here...

OR,

If you want to suppress only a specific set of warnings, then you can filter like this:

      import logging
    
for name in logging.Logger.manager.loggerDict.keys():
    if ('boto' in name) or ('urllib3' in name) or ('s3transfer' in name) or ('boto3' in name) or ('botocore' in name) or ('nose' in name):
            logging.getLogger(name).setLevel(logging.CRITICAL)

#rest of the code starts here...

Например, вы можете игнорировать это предупреждение:

InsecureRequestWarning: к хосту отправляется непроверенный HTTPS-запрос...

      import warnings

warnings.filterwarnings(
    action="ignore",
    message=".*Unverified HTTPS.*",
)

Предупреждения выводятся через stderr, и простое решение заключается в добавлении '2> /dev/null' к CLI. это имеет большой смысл для многих пользователей, таких как пользователи с centos 6, которые застряли с зависимостями python 2.6 (например, yum), а различные модули находятся на грани исчезновения в своем покрытии.

это особенно верно для криптографии с участием SNI и так далее. можно обновить 2.6 для обработки HTTPS с помощью процедуры по адресу: https://urllib3.readthedocs.io/en/latest/user-guide.html

предупреждение все еще на месте, но все, что вы хотите, перенесено обратно. перенаправление stderr даст вам чистый вывод терминала / оболочки, хотя само содержимое stdout не изменится.

отвечая на FriendFX. Предложение одно (1) отвечает непосредственно на проблему с универсальным решением. Во втором предложении (2) учитывается цитируемый анкер re 'disable warnings', специфичный для Python 2.6, и отмечается, что пользователи RHEL/centos 6 напрямую не могут обойтись без 2.6. хотя не было приведено никаких конкретных предупреждений, параграф 2 (2) отвечает на вопрос 2.6, который я чаще всего получаю о недостатках в модуле криптографии и о том, как можно "модернизировать" (то есть обновить, backport, исправить) производительность HTTPS/TLS в Python., абзац третий (3) просто объясняет результат использования перенаправления и обновления модуля / зависимостей.

Я написал декоратор, который позволяет легко игнорировать предупреждения только в определенных определениях функций:

      import functools
import warnings

from typing import Callable

def ignore_warnings(category: Warning):
    def ignore_warnings_decorator(func: Callable):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            with warnings.catch_warnings():
                warnings.simplefilter("ignore", category=category)
                return func(*args, **kwargs)
        return wrapper
    return ignore_warnings_decorator

Пример использования:

      @ignore_warnings(category=DeprecationWarning)
def foo() -> None:
    # imagine this function below would throw a deprecation
    # warning that we willfully want to ignore because we know better:
    bar()

Добавьте это в начало вашего кода,

import warnings
warnings.filterwarnings("ignore")

Вы можете использовать этот код в верхней части main.py:

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn
Другие вопросы по тегам