Показывать подсказку при ожидании неблокирующего ввода пользователя в Python - PullRequest
0 голосов
/ 04 июня 2019

У меня есть неблокирующее чтение из sys.stdin с использованием select, которое чередует обработчики для моего сокета и ввода пользователя:

while True:
    input_ready, _, _ = select.select([my_socket, sys.stdin], [], [])
    for sender in input_ready:
        if sender == sys.stdin:
            process_user_input()
        elif sender == my_socket:
            process_socket_reply()

в process_user_input() У меня есть:

command = input()

для получения и обработки пользовательского ввода.

Я хочу показать подсказку, чтобы дать пользователям вид, подобный терминалу;точно так же, как при использовании input('> ') в блокирующем вводе стандартного ввода мы можем достичь.

Но, если я использую input('> ') в моем process_user_input(), > будет напечатано после того, как пользователь введет свою команду (какожидается!)

some_command
> Invalid command. 

Как я могу это сделать?

ПРИМЕЧАНИЕ : поскольку в моем коде происходят другие события, в stdout могут быть некоторые отпечатки (таким образом, print('> ', end='') потерпит неудачу).Поэтому я хочу, чтобы мой > присутствовал всякий раз, когда я жду ввода, даже после нескольких отпечатков в терминале.

1 Ответ

0 голосов
/ 04 июня 2019

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

Поскольку вы хотите, чтобы приглашение '> ' отображалось в той же строке, что и ввод вашего пользователя, вы не можете написать новую строку после ее сбросабуфер.Вместо этого вы должны добавить аргумент flush к вашему вызову функции print:

print(end='> ', flush=True)

Если вы хотите, чтобы подсказка появлялась после вывода на экран другого вывода, вы можете:

  • Добавьте print(end='> ', flush=True) в конец любого другого кода, который производит вывод, пока ваша программа ожидает ввода данных пользователем.

  • Создайте собственную реализацию стандартного вывода Pythonпоток sys.stdout, который добавляет print(end='> ', flush=True) всякий раз, когда другие части вашей программы печатают новую строку.

  • Используйте расширенный набор инструментов терминала, такой как Python Prompt Toolkit или Проклятия , чтобы всегда держать подсказку '> ' в нижней части окна терминала.

...