Чтение из sys.stdin, завершение ввода пользователя клавишей RETURN - PullRequest
0 голосов
/ 10 января 2019

Я работаю над сценарием с пользовательским вводом в Py 3.6.

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

Поскольку пользовательский ввод может содержать новые строки, я думаю, что я не могу использовать input(), но использую sys.stdin.read() (как предложено здесь ).

Задача

Чтение во вводе работает нормально, но для окончания пользовательского ввода пользователь должен нажать Return и затем использовать комбинацию клавиш CTRL + d (см. здесь ). (См. Текущая процедура ниже)

Вопрос

  • Я бы предпочел, чтобы пользователь мог просто завершить ввод до sys.stdin.read, нажав клавишу Return (см. Ожидаемая процедура ниже)

РЕДАКТИРОВАТЬ: Любое другое упрощение текущего процесса с CTRL + d также приветствуется.

  • Это выполнимо?

  • Есть некоторые хаки здесь но я подумал, может быть, есть лучший способ

Текущий код

    # display text on screen
    print("Review this text\n" + text)
    # user will copy and paste relevant items from text displayed into Terminal
    user_input =  sys.stdin.read() 
    print ("hit ctrl + d to continue")
    # process `user_input`

Текущая процедура

С текущим кодом, воспроизведенным ниже, пользователь должен

1) вставить текст 2) нажмите RETURN, чтобы завершить ввод 3) нажмите Ctrl+d, чтобы перейти к следующему файлу

Ожидаемая процедура

Я хотел бы уменьшить это до:

1) вставить текст 2) нажмите RETURN, чтобы завершить ввод и перейти к следующему файлу

Запуск Python 3.5.6 на MacOSX с использованием терминала для ввода текста. Любая помощь очень ценится!

1 Ответ

0 голосов
/ 11 января 2019

Исходя из вашего ответа в комментарии, если допустимо завершение пустой строкой (т. Е. Ваш вводимый текст не может содержать новую строку, кроме как для завершения ввода), то есть кавычка тривиальна:

user_input = ''          # User input we'll be adding to
for line in sys.stdin:   # Iterator loops over readline() for file-like object
    if line == '\n':     # Got a line that was just a newline
        break            # Break out of the input loop
    user_input += line   # Keep adding input to variable

Другой вариант, который я упоминал, хотя мне не очень нравятся предположения, лежащие в основе этого подхода. Вы можете прочитать ваш ввод и записать время каждого введенного. Вы можете определить ограничение по времени, после которого вы можете предположить, что оно не было частью копирования и вставки как отдельный блок. А следующий символ новой строки считается концом пользовательского ввода. Например:

import sys
import time

COPY_PASTE_LIMIT = 0.5  # For instance 500ms
                        # Presuming platform time precision
                        # greater then whole seconds.

user_input = ''
last = 0  # We'll also later terminate when input was nothing
          # but an initial empty line.
for line in sys.stdin:
    now = time.time()
    if line == '\n' and (now - last > COPY_PASTE_LIMIT or last == 0):
        break
    last = now
    user_input += line

print(user_input)
...