remove last STDOUT line in Python

后端 未结 5 746
温柔的废话
温柔的废话 2020-11-28 11:17

I am trying to figure out how to suppress the display of user input on stdout.

raw_input() followed by any print statement preserves what the user typed

相关标签:
5条回答
  • 2020-11-28 11:27

    Give this a try:

    CURSOR_UP = '\033[F'
    ERASE_LINE = '\033[K'
    print(CURSOR_UP + ERASE_LINE)
    
    0 讨论(0)
  • 2020-11-28 11:34

    You might be able to do what you want with VT100 control codes.

    Something like this maybe:

    CURSOR_UP_ONE = '\x1b[1A'
    ERASE_LINE = '\x1b[2K'
    print(CURSOR_UP_ONE + ERASE_LINE)
    
    0 讨论(0)
  • 2020-11-28 11:34

    I am not entirely sure if this works: maybe you could, just before calling raw_input(), replace sys.stdout with your self-defined file-like object which swallows the output. Right after that, you could set sys.stdout back to what it has been before.

    Edit: looks like this approach does not work, because whatever the user types in stays on the screen.

    Another option for console manipulation and direct keyboard control is curses.

    0 讨论(0)
  • 2020-11-28 11:38

    The following code, based on the Python docs, uses the termios module and seems to do what you want (although it is not as compact as VT100 control codes):

    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()
    

    There are two tricky lines: one disables the echo, the other one erases your password prompt remaining at the first position of the line.

    0 讨论(0)
  • 2020-11-28 11:44

    If what you're doing is reading a password, use getpass. There are a lot of subtle gotchas involved in reading a password safely; it's not code you want to write yourself.

    If you are doing something less security-critical, disabling terminal echo can be done with the termios module. (I wish the example code there wasn't an incomplete, unsafe implementation of getpass, sigh. But it does show you how to turn off terminal echo.)

    If you're on Windows, there is an equivalent but I don't know what it is, and it may not be exposed in the Python standard library.

    0 讨论(0)
提交回复
热议问题