warning remove quitar how eliminar python suppress-warnings paramiko pycrypto

remove - python dismiss warning



Cómo suprimir una advertencia de un tercero usando warnings.filterwarnings (3)

Estoy usando Paramiko en mi código de python (para sftp). Todo funciona bien, excepto que cada vez que importo o llamo una función paramiko. Esta advertencia se mostraría:

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)

Sé que esto tiene que ver con el hecho de que Paramiko está usando algunas funcionalidades en desuso de PyCrypto.

Mi pregunta es, ¿hay una manera de suprimir esta advertencia programáticamente? He intentado esto:

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

e incluso esto:

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

antes de la instrucción ''importar paramiko'' y antes de las llamadas a funciones específicas de paramiko, pero nada funciona. Esta advertencia sigue apareciendo no importa qué. Si ayuda, aquí está el código en la biblioteca de terceros que imprime la advertencia:

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

Si conoce una forma de evitar esto, ayúdeme a apagar esta advertencia.


El argumento del module a warnings.filterwarnings toma una expresión regular que warnings.filterwarnings mayúsculas y minúsculas que debe coincidir con el nombre del módulo completo, por lo que

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

o

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

Deberia trabajar. Es posible que deba escribir RandomPool_DeprecationWarning explícitamente en lugar de DeprecationWarning si, por algún motivo, RandomPool_DeprecationWarning no es una subclase de DeprecationWarning .

También puede deshabilitar la advertencia en la línea de comandos cuando invoque el script al pasar la opción -W al intérprete de la siguiente manera:

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

La -W toma filtros en la action:message:category:module:lineno formato action:message:category:module:lineno , donde este module tiempo debe coincidir exactamente con el nombre del módulo (completamente calificado) donde aparece la advertencia.

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


La forma más fácil sería como sugiere el módulo de advertencias here :

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


Para filtrar solo una advertencia específica:

with warnings.catch_warnings(): warnings.simplefilter(''ignore'', SpecificWarningObject) #do something that raises a Warning