Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to suppress a third-party warning using warnings.filterwarnings

I am using Paramiko in my python code (for sftp). Everything works fine except that everytime I import or call a paramiko function. This warning would show up:

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) 

I know that this has to do with the fact that Paramiko is using some Deprecated functionalities of PyCrypto.

My question is, is there a way to suppress this warning programmatically ? I have tried this:

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

and even this:

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

before 'import paramiko' statement and before paramiko-specific function calls, but nothing works. This warning keeps showing up no matter what. If it helps, here's the code in the third party library that prints the warning:

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

If you know a way around this, please help me shut this warning off.

like image 256
Tom Nguyen Avatar asked Oct 13 '10 03:10

Tom Nguyen


People also ask

How do you suppress a warning in Python?

Use the filterwarnings() Function to Suppress Warnings in Python. The warnings module handles warnings in Python. We can show warnings raised by the user with the warn() function. We can use the filterwarnings() function to perform actions on specific warnings.

How do I ignore DeprecationWarning?

Use warnings. filterwarnings() to ignore deprecation warnings Call warnings. filterwarnings(action, category=DeprecationWarning) with action as "ignore" and category set to DeprecationWarning to ignore any deprecation warnings that may rise.


2 Answers

Easiest way would be as the warnings module suggests here:

with warnings.catch_warnings():     warnings.simplefilter("ignore")     import paramiko 
like image 163
snapshoe Avatar answered Sep 23 '22 06:09

snapshoe


The module argument to warnings.filterwarnings takes a case-sensitive regular expression which should match the fully qualified module name, so

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

or

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

should work. You may need to write RandomPool_DeprecationWarning explicitly instead of DeprecationWarning if for some reason RandomPool_DeprecationWarning is not a subclass of DeprecationWarning.

You can also disable the warning on the command line when you invoke the script by passing the -W option to the interpreter like so:

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

The -W takes filters in the format action:message:category:module:lineno, where this time module must exactly match the (fully-qualified) module name where the warning is raised.

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

like image 34
Blaine Rogers Avatar answered Sep 25 '22 06:09

Blaine Rogers