就我所见,此问题之前已被询问过,但仍然没有答案。所以我再次问这个问题,以便最终得到这个问题的答案。 (如果我错了,请给我答案的网址。)如何在python中输入密码并为用户的每个角色打印一个星号?
问题:程序员希望用户输入密码。 getpass()函数很好用于此目的,但它的使用有一个缺点:在输入密码时,没有任何内容被打印到stdout。
问题:如何才能将getpass()被星号的同时打印由用户键入的每一个字符来实现? (当然退格 - 甚至是POS1和年底 - 应采取照顾相应。)
的动机:已经有社会人士不明白为什么这个问题已经被问。然后用以下方法提及getpass() a)通过这种方式忽略手头的任务和b)不考虑那里的引用不会回答问题。 s.o.的原因可能希望打印星号以方便用户:在密码输入期间,他们会得到直接的视觉响应。因此,他们不会因按下按键而感到困惑,而且对于眼睛 - 似乎没有任何事情发生。
向溶液的步骤:
让我介绍这里走向一个解决方案的第一步。请帮助将其发展成真正的解决方案。
有一个名为残培这似乎允许从标准输入通过字符读取字符模块。退格键是 - 很奇怪 - 映射到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如果s.o不是'\ b'。输入退格键。也许是这样。有这个解释吗?第二个只有ASCII字符被处理,至少在Linux上。我不知道Windows在这里,但如果按下A-Z0-9以外的字符,则行c = getch.getch()将引发异常。 getch()似乎无法处理元音变音和其他类型的字符,至少在某种程度上。
来解决输入以下问题应该得到解决:
- 如何从标准输入读由字符对于非ASCII字符进行字符?
- 这怎么能以平台独立的方式完成?
- 这是如何安全地完成的(没有安全问题)?(将getpass某种程度上似乎为解决这一点,但我不完全了解。)
也许没有人知道这件事。据我所知,此前一直被问到的问题仍未得到解答。但是也许社区中有一些软件开发人员对此有了更多的了解,并且可以在这里提供帮助?成功之后,我可以将GitHub上提供的解决方案作为python模块。
“这是很直接的” - 不,不是真的:-)对不起,但不是每个人都知道的TTY和他们所有的特殊性每一个细节:-) - 和read(1)是没有多大用处:据我了解,python中的STDIN是逐行处理的。这是基本问题之一。不过,我会看看你在这里提供的其他信息。有些似乎很有用。非常感谢你! –
STDIN的linewise处理不是一个基本的python问题; TTY传统上是线路缓冲的,以允许线路编辑在客户端执行。另外,读取(1)在需要读取单个字节时非常有用。 –