Как подавить стороннее предупреждение с помощью warnings.filterwarnings

Я использую Paramiko в своем коде Python (для sftp). Все работает нормально, за исключением того, что каждый раз, когда я импортирую или вызываю функцию paramiko. Это предупреждение появится:

C:\Python26\lib\site-packages\Crypto\Util\randpool.py:40: RandomPool_Deprecation
Warning: This application uses RandomPool, which is BROKEN in older releases.  S
ee http://www.pycrypto.org/randpool-broken
  RandomPool_DeprecationWarning)

Я знаю, что это связано с тем, что Paramiko использует некоторые устаревшие функции PyCrypto.

Мой вопрос: есть ли способ программно подавить это предупреждение? Я пробовал это:

warnings.filterwarnings(action='ignore', \
category=DeprecationWarning, module='paramiko')

и даже это:

warnings.filterwarnings(action='ignore', \
category=DeprecationWarning, module='randpool')

перед оператором «import paramiko» и перед вызовами функций, специфичных для paramiko, но ничего не работает. Это предупреждение продолжает появляться несмотря ни на что. Если это поможет, вот код в сторонней библиотеке, который выводит предупреждение:

в randpool.py:

from Crypto.pct_warnings import RandomPool_DeprecationWarning
import Crypto.Random
import warnings

class RandomPool:
    """Deprecated.  Use Random.new() instead.

    See http://www.pycrypto.org/randpool-broken
    """
    def __init__(self, numbytes = 160, cipher=None, hash=None, file=None):
        warnings.warn("This application uses RandomPool, which is BROKEN in older releases.  See http://www.pycrypto.org/randpool-broken",
            RandomPool_DeprecationWarning)

Если вы знаете способ обойти это, пожалуйста, помогите мне отключить это предупреждение.


person Tom Nguyen    schedule 13.10.2010    source источник


Ответы (4)


Самый простой способ — модуль предупреждений предлагает здесь:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    import paramiko
person snapshoe    schedule 13.10.2010
comment
Как бы вы изменили это, чтобы фильтровать только конкретные предупреждения OP? - person VF1; 17.08.2017
comment
@VF1 См. ответ Кайла - person Oren Milman; 21.06.2020

Аргумент module для warnings.filterwarnings принимает регулярное выражение с учетом регистра, которое должно соответствовать полному имени модуля, поэтому

warnings.filterwarnings(
    action='ignore',
    category=DeprecationWarning,
    module=r'.*randpool'
)

or

warnings.filterwarnings(
    action='ignore',
    category=DeprecationWarning,
    module=r'Crypto\.Utils\.randpool'
)

должно сработать. Возможно, вам придется явно написать RandomPool_DeprecationWarning вместо DeprecationWarning, если по какой-то причине RandomPool_DeprecationWarning не является подклассом DeprecationWarning.

Вы также можете отключить предупреждение в командной строке при вызове скрипта, передав параметр -W интерпретатору следующим образом:

$ python -W ignore::RandomPool_DeprecationWarning:Crypto.Utils.randpool: my_script.py

-W принимает фильтры в формате action:message:category:module:lineno, где на этот раз module должно точно соответствовать (полному) имени модуля, в котором возникает предупреждение.

См. https://docs.python.org/2/library/warnings.html?highlight=warnings#the-warnings-filter и https://docs.python.org/2/using/cmdline.html#cmdoption-w

person Blaine Rogers    schedule 10.12.2018
comment
сначала import пользовательское предупреждение, а затем используйте его в category - person Darren Weber; 07.02.2019

Чтобы отфильтровать только конкретное предупреждение:

with warnings.catch_warnings():
    warnings.simplefilter('ignore', SpecificWarningObject)

    #do something that raises a Warning
person Kyle    schedule 15.09.2017

Самый гибкий способ — объединить warnings.filterwarnings(). с контекстным менеджером warnings.catch_warnings(). Таким образом, вы получаете гибкость filterwarnings, но фильтрация применяется только внутри блока with:

import warnings
from Crypto.pct_warnings import RandomPool_DeprecationWarning

with warnings.catch_warnings():
    warnings.filterwarnings(
        action='ignore',
        category=RandomPool_DeprecationWarning,
        message='This application uses RandomPool, which is BROKEN in older releases')
   
    # Do stuff that causes the warning

person np8    schedule 22.09.2020