我试图找出如何抑制在stdout用户输入的显示。
raw_input()
跟任何打印语句保留用户键入的内容。 getpass()
不显示用户键入的内容,但它确实保留了“密码:”提示。
为了解决这个问题,我想,只除去最后一行(这从行的末尾删除换行以及)。
我试图找出如何抑制在stdout用户输入的显示。
raw_input()
跟任何打印语句保留用户键入的内容。 getpass()
不显示用户键入的内容,但它确实保留了“密码:”提示。
为了解决这个问题,我想,只除去最后一行(这从行的末尾删除换行以及)。
你也许可以做你想做什么VT100控制码 。
事情是这样的,也许:
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
如果你正在做的是阅读的密码,使用getpass
。 有很多涉及安全地读取密码微妙的陷阱的; 它不是代码,你要自己写。
如果你正在做的事情不太安全关键,关闭终端回声可以用做termios
模块。 (祝示例代码有没有一个不完整的,不安全的实施getpass
,叹了口气。但它确实表明您如何关闭终端回声。)
如果你在Windows上,有一个等效的,但是我不知道它是什么,它可能不会在Python标准库被暴露。
我不能完全肯定,如果这个工程:也许你可以,只调用之前raw_input()
替换sys.stdout
与燕子输出你自定义的类文件对象。 紧接着的是,你可以设置sys.stdout
回到它以前一直。
编辑:是这样的方法是行不通的,因为无论在屏幕上停留的用户类型。
控制台操作和键盘直接控制的另一种选择是诅咒 。
下面的代码,基于Python的文档,使用termios
模块,似乎你想要做什么(虽然它并不像紧凑VT100控制码):
def getpass(prompt="Password: "):
import termios, sys
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ECHO
try:
termios.tcsetattr(fd, termios.TCSADRAIN, new)
passwd = raw_input(prompt)
print '\r \r',
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
return passwd
p = getpass()
有两个棘手线:一条禁止回声,另一种清除您的密码提示剩余在该行的第一个位置。
试试这个:
CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)