Ввод Python () не обнаруживает EOL в терминале MINGW (но делает это в терминале CMD)

Я запускаю следующую программу на python 3.5.2 в Windows 10:

username = input('uname:')

Если я запускаю в терминале MINGW, функция input() предлагает подсказку, но не возвращается после того, как я набираю текст, за которым следует клавиша <RETURN>.

Запуск той же программы в терминале команды (cmd.exe), input() возвращает строку, как и ожидалось.

Я подозреваю, что это связано с разными представлениями EOL в Windows и MinGW. Я пытался подделать Windows EOL, набрав ^M <RETURN>, но безрезультатно.

В идеале я хотел бы решить эту проблему «в сценарии» и сделать ее прозрачной для пользователя, но в противном случае мне нужно какое-то решение, даже если в этом случае пользователь должен ввести какую-то волшебную комбинацию клавиш.

Кстати, та же проблема (не обнаружение EOL) возникает, если я запускаю скрипт в отладчике Python Code Visual Studio.


person Ken    schedule 14.12.2016    source источник


Ответы (1)


У меня недавно была аналогичная проблема.

После некоторого осмотра я закончил тем, что отказался от input и пошел с чем-то вроде этого, который проверяет порядок символов конечной строки (на основе это ответ):

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()
person Dan Gonzalez    schedule 20.12.2016