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


421

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

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

Что бы вы порекомендовали?


9
@MartinSamson Я в целом согласен, но есть законные случаи игнорирования предупреждений. Я получаю некоторый из них с помощью допустимого синтаксиса Xpath в 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]. Я предпочел бы игнорировать предупреждения сейчас и подождать, пока они будут исправлены, а не писать ненужный безобразный код, чтобы избежать безобидного предупреждения.
Педро

1
отключить определенные предупреждения: stackoverflow.com/questions/9134795/…
user3226167

Ответы:



576

Вы смотрели раздел подавления предупреждений в документации по 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

12
@Framester - да, IMO, это самый чистый способ подавления определенных предупреждений, предупреждения есть вообще, потому что что-то может быть не так, поэтому подавление всех предупреждений через командную строку может быть не лучшим выбором.
Майк

1
@Framester - я перечислил и другой вариант с примером ... Мне он не очень нравится (по причине, которую я привел в предыдущем комментарии), но, по крайней мере, теперь у вас есть инструменты.
Майк

41
Если вы ожидаете categorywarnings.filterwarnings("ignore", category=DeprecationWarning)
получать

1
Это полезно для меня в этом случае, потому что html5lib выдает предупреждения lxml, даже если он не анализирует xml. Спасибо
jamescampbell

5
Существует также полезный параметр для warnings.filterwarnings функции: module. Это позволяет игнорировать предупреждения от указанного модуля.
имя пользователя

106

Вы также можете определить переменную окружения (новая функция в 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')
>>> 

Для предупреждений об устаревших взглянуть на как игнорировать-предупреждения-в-питоне

Скопировано здесь ...

Из документации warningsмодуля :

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

Если вы в Windows: передайте -W ignore::DeprecationWarningв качестве аргумента Python. Хотя лучше решить проблему, приведя к int .

(Обратите внимание, что в Python 3.2 предупреждения об устаревании по умолчанию игнорируются.)

Или:

import warnings

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

yourcode()

Теперь вы все еще получаете все остальные DeprecationWarning, но не те, которые вызваны:

import md5, sha

2
Это особенно полезно, чтобы игнорировать предупреждения при выполнении тестов. Использование tox, добавление PYTHONWARNINGS=ignoreк setenvделает вывод менее грязным.
Курт Бурбаки

2
Очень полезно и для AWS CLI.
Маккензм

1
Но это не игнорирует предупреждение об устаревании. Могу я спросить, как включить это?
Вей Ши


70

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

import sys
import warnings

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

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


Это идеально, так как не отключит все предупреждения при последующем исполнении
Орсирис де Йонг

53

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

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

10
И чтобы вернуться к поведению по умолчанию:warnings.filterwarnings("default", category=FutureWarning)
Ганс

17

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

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

0

Я понимаю, что это применимо только к нише ситуаций, но в 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

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


-5

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

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

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

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


4
Спасибо, что нашли время ответить. Пожалуйста, держите ответы строго по теме: вы упоминаете довольно много вещей, которые не имеют отношения к вопросу в его нынешнем виде, например, CentOS, Python 2.6, криптография, urllib, обратное портирование. Вы можете редактировать свой вопрос, чтобы удалить эти биты. Если вы хотите узнать больше подробностей из ОП, оставьте комментарий под вопросом.
FriendFX
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.