是否可以隐藏 getpass() 警告?

Is it possible to hide the getpass() warning?

如果 getpass() 无法隐藏消息,是否可以隐藏显示的消息?

GetPassWarning: Can not control echo on the terminal.
Warning: Password input may be echoed.

是否可以用其他对用户更友好的内容替换此消息?如果是,如何?

据我所知,此消息不可自定义。这是一个解决方法。

在幕后,getpass.getpass是echo无法关闭时的以下函数。

def fallback_getpass(prompt='Password: ', stream=None):
    warnings.warn("Can not control echo on the terminal.", GetPassWarning,
                  stacklevel=2)
    if not stream:
        stream = sys.stderr
    print("Warning: Password input may be echoed.", file=stream)
    return _raw_input(prompt, stream)

如果您想自定义消息,您可以编写自己的调用 getpass._raw_input 的函数。例如,

import sys
import getpass

def custom_getpass(prompt='Password: ', stream=None):
    if not stream:
        stream = sys.stderr
    print("This is a custom message to the user.", file=stream)
    return getpass._raw_input(prompt, stream)

然后您可以直接调用您的 custom_getpass 函数,或者您可以将 getpass.getpass 替换为您的自定义函数。

getpass.getpass = custom_getpass

# This prints "This is a custom message to the user." before getting the
# password.
getpass.getpass()

请注意,上述方法将始终 打印自定义警告并始终将密码回显给用户。如果您只想在使用回退 getpass 时使用自定义函数,您可以通过简单地检查 getpass 正在使用哪个函数来实现 getpass.getpass。例如

if getpass.getpass == getpass.fallback_getpass:
    getpass.getpass = custom_getpass

# If echo could not be disabled, then this prints "This is a custom
# message to the user." before getting the password.
getpass.getpass()

请注意,在 Python 的未来版本中,这可能会中断,恕不另行通知,因为解决方法依赖于模块的“私有”功能。