web-dev-qa-db-ja.com

warnings.filterwarningsを使用してサードパーティの警告を抑制する方法

pythonコード(sftpの場合)でParamikoを使用しています。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)

これを回避する方法がわかっている場合は、この警告をオフにしてください。

33
Tom Nguyen

最も簡単な方法は、警告モジュールが示唆するように here です:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    import paramiko
36
snapshoe

特定の警告のみをフィルタリングするには:

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

    #do something that raises a Warning
8
Kyle

warnings.filterwarningsへのmodule引数は、完全修飾モジュール名と一致する必要がある大文字と小文字を区別する正規表現を取ります。

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

または

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

うまくいくはずです。何らかの理由でRandomPool_DeprecationWarningDeprecationWarningのサブクラスでない場合は、DeprecationWarningではなくRandomPool_DeprecationWarningを明示的に書き込む必要がある場合があります。

次のように、-Wオプションをインタープリターに渡すことにより、スクリプトを呼び出すときにコマンドラインで警告を無効にすることもできます。

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

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

4
Blaine Rogers