Як відключити попередження python


420

Я працюю з кодом, який викидає безліч (для мене наразі) марних попереджень за допомогою 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

Ви подивилися розділ придушення попереджень підотонних документів?

Якщо ви використовуєте код, який, на вашу думку, підніме попередження, наприклад, застарілу функцію, але ви не хочете бачити попередження, тоді можливо придушити попередження за допомогою менеджера контексту 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. Це дозволяє ігнорувати попередження із зазначеного модуля.
ім’я користувача

104

Ви також можете визначити змінну середовища (нова функція в 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()

Тепер ви все ще отримаєте всі інші DeprecationWarnings, але не ті, що викликані:

import md5, sha

2
Особливо корисно це ігнорувати попередження під час виконання тестів. Використовуючи tox, додаючи PYTHONWARNINGS=ignoreдо setenvвиходу робить менше брудним.
Курт Бурбакі

2
Дуже корисний і для AWS CLI.
mckenzm

1
Але це не ігнорує попередження про депресію. Чи можу я запитати, як це включити?
Вей Ши

@Wey Shi, подивіться на stackoverflow.com/questions/879173/…
Holger Bille

70

Це старе питання, але в PEP 565 є новіші вказівки , щоб вимкнути всі попередження, якщо ви пишете програму python, яку ви повинні використовувати:

import sys
import warnings

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

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


Це ідеально, оскільки не вимкне всі попередження щодо подальшого виконання
Orsiris de Jong

52

Якщо ви не хочете чогось складного, тоді:

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 et cetera. можна оновити 2.6 для обробки HTTPS за допомогою протоколу: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

попередження все ще діє, але все, що ви хочете, переноситься назад. повторне пряме введення stderr залишить вас з чистим висновком термінала / оболонки, хоча сам вміст stdout не змінюється.

відповідаючи на FriendFX. речення перше (1) безпосередньо відповідає на проблему універсальним рішенням. речення 2 (2) враховує цитований прив'язку, яка повторно відключає попередження, що є специфічним для python 2.6, і зазначає, що користувачі RHEL / centos 6 не можуть безпосередньо обійтися без 2.6. хоча жодних конкретних попереджень не наводиться, пункт 2 (2) відповідає на питання 2.6, що я найчастіше отримую повторні коментарі в криптографічному модулі і як можна "модернізувати" (тобто оновити, підтримувати, виправити) ефективність HTTPS / TLS python . абзац третій (3) просто пояснює результат використання повторного прямого та оновлення модуля / залежностей.


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