При использовании python cmd.Cmd для создания пользовательского интерфейса командной строки, как мне сообщить обработчику прервать текущую строку и дать мне новое приглашение?
Вот минимальный пример:
# console_min.py
# run: 'python console_min.py'
import cmd, signal
class Console(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "[test] "
signal.signal(signal.SIGINT, handler)
def do_exit(self, args):
return -1
def do_EOF(self, args):
return self.do_exit(args)
def preloop(self):
cmd.Cmd.preloop(self)
self._hist = []
self._locals = {}
self._globals = {}
def postloop(self):
cmd.Cmd.postloop(self)
print "Exiting ..."
def precmd(self, line):
self._hist += [ line.strip() ]
return line
def postcmd(self, stop, line):
return stop
def emptyline(self):
return cmd.Cmd.emptyline(self)
def handler(self, signum, frame):
# self.emptyline() does not work here
# return cmd.Cmd.emptyline(self) does not work here
print "caught ctrl+c, press return to continue"
if __name__ == '__main__':
console = Console()
console.cmdloop()
Дальнейшая помощь приветствуется.
Оригинальный вопрос и более подробная информация: [В настоящее время приведенные ниже предложения были включены в этот вопрос - все еще ищут ответ. Обновлено для исправления ошибки.]
С тех пор я попытался переместить обработчик на функцию вне цикла, чтобы убедиться, что она более гибкая, но она не выглядит.
Я использую python cmd.Cmd module, чтобы создать собственный интерпретатор командной строки для управления взаимодействием с некоторым программным обеспечением. Я часто нажимаю ctrl + c, ожидая популярного поведения в оболочке, возвращающего новое приглашение, не действуя ни на какую команду. Однако он просто выходит. Я попытался поймать исключения KeyboardInterrupt в разных точках кода (preloop и т.д.) Безрезультатно. Я немного читал в sigints, но не совсем понимаю, как это вписывается здесь.
UPDATE: из приведенных ниже предложений я попытался реализовать сигнал и смог сделать так, чтобы ctrl + c не выходил из CLI, но печатает сообщение. Тем не менее, моя новая проблема заключается в том, что я не могу описать функцию обработчика (см. Ниже), чтобы сделать многое рядом с печатью. Я хотел бы, чтобы ctrl + c в основном прервал текущую строку и дал мне новое приглашение.