删除Python中的最后一个STDOUT行

时间:2012-09-25 15:50:50

标签: python stdout command-prompt

我试图弄清楚如何在stdout上禁止显示用户输入。

raw_input()后跟任何print语句,保留用户输入的内容。getpass()不显示用户输入的内容,但保留了“密码:”提示。

要解决这个问题,我想只删除最后一行(这也会从行尾删除换行符)。

5 个答案:

答案 0 :(得分:41)

您可以使用VT100 control codes完成所需的操作。

这样的事情可能是:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)

答案 1 :(得分:1)

我不完全确定这是否有效:也许你可以在调用raw_input()之前,将sys.stdout替换为吞噬输出的自定义文件类对象。在此之后,您可以将sys.stdout设置回原来的状态。

编辑:看起来这种方法不起作用,因为无论用户输入什么类型都停留在屏幕上。

控制台操作和直接键盘控制的另一个选项是curses

答案 2 :(得分:1)

如果您正在阅读密码,请使用getpass。安全地阅读密码涉及许多微妙的陷阱;这不是你想自己编写的代码。

如果您正在做一些安全性较低的事情,可以使用termios模块禁用终端回显。 (我希望示例代码没有getpass的不完整,不安全的实现,叹息。但它确实向您展示了如何关闭终端回声。)

如果你在Windows上,有一个等价物,但我不知道它是什么,它可能不会在Python标准库中公开。

答案 3 :(得分:1)

以下代码基于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()

有两条棘手的线路:一条禁用回声,另一条则删除保留在线路第一个位置的密码提示。

答案 4 :(得分:1)

尝试一下:

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)