Я пишу программу, которая отображает текст на терминале, используя Unix less (1). Вот соответствующая часть:
less = subprocess.Popen(['less -F -'], stdin=subprocess.PIPE,
stdout=sys.stdout, shell=True)
try:
less.stdin.write(rfc_text)
less.stdin.flush()
less.stdin = sys.stdin
less.wait()
except IOError:
less.terminate()
return errno.EPIPE
except KeyboardInterrupt:
less.terminate()
return 0
В ожидании завершения, я слушаю исключение KeyboardInterrupt. Если я поймаю его, я убью меньше с помощью сигнала SIGTERM и выйду из своей программы.
Теперь, когда это происходит, я возвращаюсь к моей подсказке оболочки, но оболочка больше не повторяет то, что я пишу, и мне приходится делать сброс (1), чтобы она снова заработала.
Есть какие-нибудь идеи о том, как заставить меньше умирать, не взяв с собой мой stdin в могилу? Полный источник доступен на https://github.com/jforberg/rfc/blob/master/rfc.py
РЕДАКТИРОВАТЬ: После некоторых экспериментов я обнаружил, что и less (1), и man (1) по умолчанию игнорируют удар control-C. Поэтому простое игнорирование может быть приемлемым вариантом. Я не уверен, что думаю, что это правильный способ сделать это, поэтому, если у кого-то есть предложения, я все еще очень заинтересован.