Я написал приложение Python 3.5, используя модуль cmd. Последнее, что я хотел бы реализовать, — это правильная обработка сигнала CTRL-C (sigint). Я хотел бы, чтобы он вел себя более или менее так, как это делает Bash:
- напечатайте ^C в точке, где находится курсор
- очистить буфер, чтобы удалить введенный текст
- перейти к следующей строке, распечатать приглашение и дождаться ввода
В принципе:
/test $ bla bla bla|
# user types CTRL-C
/test $ bla bla bla^C
/test $
Вот упрощенный код в качестве исполняемого примера:
import cmd
import signal
class TestShell(cmd.Cmd):
def __init__(self):
super().__init__()
self.prompt = '$ '
signal.signal(signal.SIGINT, handler=self._ctrl_c_handler)
self._interrupted = False
def _ctrl_c_handler(self, signal, frame):
print('^C')
self._interrupted = True
def precmd(self, line):
if self._interrupted:
self._interrupted = False
return ''
if line == 'EOF':
return 'exit'
return line
def emptyline(self):
pass
def do_exit(self, line):
return True
TestShell().cmdloop()
Это почти работает. Когда я нажимаю CTRL-C, рядом с курсором печатается ^C, но мне все равно приходится нажимать ввод. Затем метод precmd
замечает свой флаг self._interrupted
, установленный обработчиком, и возвращает пустую строку. Это все, что я мог понять, но я хотел бы как-то не нажимать этот ввод.
Я думаю, мне как-то нужно заставить input()
вернуться, у кого-нибудь есть идеи?
'\n'
или пробел вstdout
? То есть после того, как обработчик сигнала отключится, добавьте новую строку в конце'^C'
- person tijko   schedule 22.05.2016