在不停止部分Progam的情况下捕获Python 2.7中的警告

时间:2016-02-15 11:54:37

标签: python python-2.7 warnings try-except

我目前正在开发一个Python程序,它涉及使用用户名和密码登录。我正在使用Warning (from warnings module): File "C:\Python27\lib\getpass.py", line 92 return fallback_getpass(prompt, stream) GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed. 模块来完成此任务。我的问题是,在getpass无法控制回声的情况下,它会在继续执行程序之前将以下内容喷入终端。

import getpass

try:
    getpass.getpass("Password: ")
except getpass.GetPassWarning:
    print "Oh no!"

我想要做的是抓住警告并打印我自己的自定义消息。我能想到的唯一代码是以下内容,它可以防止显示回溯,但根本不打印自定义消息。

Warning: Password input may be echoed.
Password: 

输出:

Warning: Password input may be echoed.

我想用理想的信息替换文本$(document).ready(function(){ $('.myid').hide() });

2 个答案:

答案 0 :(得分:0)

getpass使用python内置模块warnings来显示此警告消息。您可以使用各种方法(Python Docs / PyMOTW)过滤/忽略它们。

你可以像这样发出警告:

import getpass
import warnings

# the context manager resets the original
# filterwarnings after it has exited
with warnings.catch_warnings():
    # this will raise warnings of type (or inherited of type)
    # 'getpass.GetPassWarning' in the module 'getpass'
    warnings.filterwarnings(
        'error',
        category=getpass.GetPassWarning,
        module='getpass'
    )
    try:
        password = getpass.getpass('Password: ')
    except getpass.GetPassWarning:
        print 'Cannot get password on insecure platform'

答案 1 :(得分:0)

@ PM2Ring建议的方法似乎是我迄今为止发现的最佳解决方案。为了别人路过并为了回答这个问题,我将把这一切都包括在这篇文章中。

以下方法覆盖fallback_getpass模块中的getpass函数,允许人们准确控制在需要回退时发生的情况。 有点非常hacky但它​​完成了工作。

import getpass

def custom_fallback(prompt="Password: ",stream=None): #Clone of parameters from getpass.fallback_getpass
    print "Custom message." #Custom message goes here
    return getpass._raw_input(prompt) #Use getpass' custom raw_input function for security

getpass.fallback_getpass = custom_fallback #Replace the getpass.fallback_getpass function with our equivalent

password = getpass.getpass("Password: ") #Prompt for password

输出:

Custom message.
Password: