删除Python中的最后一个STDOUT行
我想弄清楚如何抑制标准输出上的用户input显示。
后跟任何打印语句的raw_input()
都会保留用户input的内容getpass()
不显示用户键入的内容,但它保留“Password:”提示符。
为了解决这个问题,我想只删除最后一行(这将从行尾删除换行符)。
你可以用VT100控制代码来做你想做的事情。
这样的事情可能是:
CURSOR_UP_ONE = '\x1b[1A' ERASE_LINE = '\x1b[2K' print(CURSOR_UP_ONE + ERASE_LINE)
如果你正在做的是读密码,使用getpass
。 安全地读取密码涉及很多细微的问题。 这不是你想要编写的代码。
如果您正在做的安全性要求不高,可以使用termios
模块禁用terminal回显。 (我希望示例代码中没有getpass
的不完整,不安全的实现,叹气,但是它确实告诉你如何closuresterminal回声。)
如果你在Windows上,有一个等价的,但我不知道它是什么,它可能不会暴露在Python标准库。
我不完全确定这是否raw_input()
:也许你可以在调用raw_input()
之前,将sys.stdout
replace为你自定义的文件types的对象,它吞下输出。 在这之后,你可以将sys.stdout
设置回它以前的样子。
编辑:看起来像这种方法不起作用,因为无论用户键入在屏幕上。
控制台操作和直接键盘控制的另一个select是诅咒 。
以下基于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)