31

我试图弄清楚如何抑制用户输入在标准输出上的显示。

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

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

4

5 回答 5

43

您可以使用VT100 控制代码做您想做的事情。

可能是这样的:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
于 2012-09-25T15:54:57.513 回答
2

试试这个:

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)
于 2016-04-12T10:13:04.387 回答
1

如果您正在做的是读取密码,请使用getpass. 安全读取密码涉及许多微妙的问题。这不是您想自己编写的代码。

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

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

于 2012-09-25T16:14:33.630 回答
1

我不完全确定这是否有效:也许您可以在调用之前raw_input()替换sys.stdout为您自定义的类似文件的对象,该对象会吞下输出。在那之后,您可以sys.stdout恢复到以前的状态。

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

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

于 2012-09-25T16:01:24.847 回答
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()

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

于 2012-09-25T17:09:01.330 回答