问题:程序员希望用户输入密码。 getpass() 函数非常适合此目的,但它的使用有一个缺点:输入密码时,不会将任何内容打印到 stdout。
问题:如何在为用户键入的每个字符打印星号时实现 getpass()? (当然 backspace - 理想情况下 pos1 和 end - 应该得到相应的照顾。)
动机:社区中有些人不明白为什么要问这个问题。然后用 a) 引用 getpass() 以忽略手头的任务和 b) 不考虑引用不会回答问题。 s.o. 的原因可能想要打印星号是为了方便用户:他们在密码输入期间得到直接的视觉响应。因此,他们不会因为按键而感到困惑,而且 - 在那里的眼睛 - 似乎什么都没有发生。
迈向解决方案的一步:
让我在这里介绍解决方案的第一步。请帮助将其演变成真正的解决方案。
有一个名为 getch 的模块,它似乎允许从 stdin 中逐个字符地读取。退格 - 很奇怪 - 映射到整数值 127,但这样的解决方案可能看起来像这样:
def readLineWithAsterisks():
sBuffer = ''
while True:
c = getch.getch()
if c == '\n':
return sBuffer
elif ord(c) == 127:
if len(sBuffer) > 0:
sys.stdout.write('\x08 \x08')
sys.stdout.flush()
sBuffer = sBuffer[0:-1]
continue
else:
sys.stdout.write('*')
sys.stdout.flush()
sBuffer += c
但是这段代码有一些缺点。首先,我对 c 不是 '\b' if s.o. 感到非常困惑。输入了一个退格键。可能是这样。对此有解释吗?其次,至少在 Linux 上只处理 ASCII 字符。我不了解这里的 Windows,但是如果按下 A-Z0-9 以外的字符,c = getch.getch() 行会抛出异常。 getch() 似乎无法处理变音符号和其他类型的字符,至少在某种程度上是这样。
要获得解决方案输入,应解决以下问题:
- 对于非 ASCII 字符,如何逐个字符地读取 stdin?
- 如何以独立于平台的方式做到这一点?
- 如何安全地完成此操作(没有安全问题)? (getpass 似乎以某种方式解决了这个问题,但我不完全理解如何。)
最佳答案
在那里查看第一个答案:
What's the simplest way of detecting keyboard input in python from the terminal?
只需在按下某个键时打印星号 '*' 或其他任何内容。
所有功劳显然都归功于 Phylliida 的研究。
关于python - 如何在 python 中输入密码并为用户的每个字符打印一个星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40651085/