Python input() не обнаруживает 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 кода Visual Studio.

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()
Другие вопросы по тегам