1

I'm running the following program in python 3.5.2 in Windows 10:

username = input('uname:')

If I run in a MINGW terminal, the input() function offers a prompt, but fails to return after I type some text followed by <RETURN> key.

Running the same program in a command(cmd.exe) terminal, the input() returns with a string as expected.

I suspect this is to do with different EOL representations in Windows vs MinGW. I've tried spoofing a windows EOL by typing ^M <RETURN> to no avail.

Ideally I would like to solve this problem 'in-script' and make it transparent to the user, but failing that I would like some solution, even if in means the user has to type some magic key-combo.

BTW, the same problem (not detecting EOL) occurs if I run the script in the Visual Studio Code python debugger.

Mike Kinghan
  • 55,740
  • 12
  • 153
  • 182
Ken
  • 4,367
  • 4
  • 28
  • 41

1 Answers1

2

I recently had a similar issue.

After some looking around, I ended up ditching input and going with something like this, which checks ordinance of endline chars (based on this answer):

import sys
import os

try:
    # Win32
    from msvcrt import getch
except ImportError:
    # UNIX
    import tty
    import termios

    def getch():
        # print('READING!')
        fd = sys.stdin.fileno()
        old = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            ch = sys.stdin.read(1)
            sys.stdout.write(ch)
            sys.stdout.flush()
            return ch
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old)

input = []

while True:
    char = getch()
    input.append(char)

    # crtl + c
    if ord(char) == 3:
        print('input: {}'.format(''.join(input)))
        sys.exit()
    # \n
    elif ord(char) == 10:
        print('input: {}'.format(''.join(input)))
        sys.exit()
    # \r
    elif ord(char) == 13:
        print('input: {}'.format(''.join(input)))
        sys.exit()
    elif ord(char) == ord(os.linesep):
        print('input: {}'.format(''.join(input)))
        sys.exit()
Community
  • 1
  • 1
Dan Gonzalez
  • 90
  • 1
  • 2
  • 10