Как отключить предупреждения Python
Я работаю с кодом с большим количеством (для меня на данный момент) бесполезных предупреждений, используя warnings
библиотека. Читая (/ сканируя) документацию, я нашел только способ отключить предупреждения для отдельных функций. Но я не хочу так сильно менять код.
Может быть, есть флаг, как python -no-warning foo.py
?
Чтобы вы посоветовали?
16 ответов
Вы смотрели раздел подавления предупреждений в документации по 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