Содержание страницы
23.1. cmd – Поддержка построчных интерпретаторов команд¶cmd – Support for line-oriented command interpreters
Исходный код: Lib/cmd.py
Класс Cmd предоставляет простую основу для написания построчных интерпретаторов команд. Они часто полезны для тестовых стендов, административных инструментов и прототипов, которые позже будут обёрнуты в более сложный интерфейс.
-
class
cmd.Cmd([completekey[, stdin[, stdout]]])¶ Экземпляр
Cmdили экземпляр подкласса представляет собой каркас построчного интерпретатора. Нет веских причин создавать экземпляр самогоCmd; напротив, его удобно использовать как суперкласс для собственного класса интерпретатора, чтобы наследовать методыCmdи инкапсулировать методы действий.Необязательный аргумент completekey – это имя клавиши автодополнения
readline; по умолчанию оно равно Tab. Если completekey не равноNoneи доступенreadline, автодополнение команд выполняется автоматически.Необязательные аргументы stdin и stdout задают объекты файлов ввода и вывода, которые экземпляр Cmd или экземпляр подкласса будет использовать для ввода и вывода. Если они не указаны, по умолчанию используются
sys.stdinиsys.stdout.Если требуется использовать определённый stdin, убедитесь, что атрибут
use_rawinputэкземпляра установлен вFalse, иначе stdin будет проигнорирован.Изменено в версии 2.3: Добавлены параметры stdin и stdout.
23.1.1. Объекты Cmd¶Cmd Objects
Экземпляр Cmd имеет следующие методы:
-
Cmd.cmdloop([intro])¶ Многократно выводит приглашение, принимает ввод, выделяет из полученного ввода начальный префикс и передаёт его методам действий, передавая им остаток строки в качестве аргумента.
Необязательный аргумент – это строка баннера или вступления, которая выводится перед первым приглашением (это переопределяет атрибут класса
intro).Если модуль
readlineзагружен, ввод будет автоматически поддерживать редактирование списка истории в стиле bash (например, Control-P прокручивает назад к последней команде, Control-N – вперёд к следующей, Control-F перемещает курсор вправо без удаления, Control-B перемещает курсор влево без удаления и т.д.).Признак конца файла на вводе передаётся обратно в виде строки
'EOF'.Экземпляр интерпретатора распознаёт имя команды
fooтолько в том случае, если у него есть методdo_foo(). В частном случае строка, начинающаяся с символа'?', передаётся методуdo_help(). В другом частном случае строка, начинающаяся с символа'!', передаётся методуdo_shell()(если такой метод определён).Этот метод завершается, когда метод
postcmd()возвращает истинное значение. Аргумент stop дляpostcmd()– это возвращаемое значение соответствующего метода командыdo_*().Если автодополнение включено, дополнение команд выполняется автоматически, а дополнение аргументов команд – вызовом
complete_foo()с аргументами text, line, begidx и endidx. text – это строковый префикс, который мы пытаемся сопоставить: все возвращённые совпадения должны с него начинаться. line – текущая строка ввода с удалёнными начальными пробелами, begidx и endidx – начальный и конечный индексы текста префикса, которые могут использоваться для разного дополнения в зависимости от позиции аргумента.Все подклассы
Cmdнаследуют предопределённыйdo_help(). Этот метод, вызванный с аргументом'bar', вызывает соответствующий методhelp_bar(), а если его нет, выводит строку документацииdo_bar(), если она доступна. Без аргументовdo_help()выводит список всех доступных тем справки (то есть всех команд, у которых есть соответствующие методыhelp_*()или строки документации), а также перечисляет недокументированные команды.
-
Cmd.onecmd(str)¶ Интерпретирует аргумент так, как если бы он был введён в ответ на приглашение. Этот метод можно переопределить, но обычно в этом нет необходимости; см. методы
precmd()иpostcmd()для полезных точек выполнения. Возвращаемое значение – флаг, указывающий, должна ли интерпретация команд интерпретатором остановиться. Если для команды str существует методdo_*(), возвращается его значение, иначе возвращается значение из методаdefault().
-
Cmd.emptyline()¶ Метод, вызываемый, когда в ответ на приглашение введена пустая строка. Если этот метод не переопределён, он повторяет последнюю введённую непустую команду.
-
Cmd.default(line)¶ Метод, вызываемый для строки ввода, когда префикс команды не распознан. Если этот метод не переопределён, он выводит сообщение об ошибке и завершается.
-
Cmd.completedefault(text, line, begidx, endidx)¶ Метод, вызываемый для автодополнения строки ввода, когда нет доступного метода
complete_*(), специфичного для команды. По умолчанию возвращает пустой список.
-
Cmd.precmd(line)¶ Метод-перехватчик, выполняемый непосредственно перед интерпретацией командной строки line, но после того, как приглашение ввода сгенерировано и выведено. Этот метод – заглушка в
Cmd; он существует для переопределения в подклассах. Возвращаемое значение используется как команда, которая будет выполнена методомonecmd(); реализацияprecmd()может переписать команду или просто вернуть line без изменений.
-
Cmd.postcmd(stop, line)¶ Метод-перехватчик, выполняемый сразу после завершения диспетчеризации команды. Этот метод – заглушка в
Cmd; он существует для переопределения в подклассах. line – это командная строка, которая была выполнена, а stop – флаг, указывающий, будет ли выполнение завершено после вызоваpostcmd(); это будет возвращаемым значением методаonecmd(). Возвращаемое значение этого метода будет использоваться как новое значение внутреннего флага, соответствующего stop; возврат false приведёт к продолжению интерпретации.
-
Cmd.preloop()¶ Метод-перехватчик, выполняемый один раз при вызове
cmdloop(). Этот метод – заглушка вCmd; он существует для переопределения в подклассах.
-
Cmd.postloop()¶ Метод-перехватчик, выполняемый один раз, когда
cmdloop()собирается вернуть управление. Этот метод – заглушка вCmd; он существует для переопределения в подклассах.
Экземпляры подклассов Cmd имеют несколько открытых переменных экземпляра:
-
Cmd.prompt¶ Приглашение, выводимое для запроса ввода.
-
Cmd.identchars¶ Строка символов, допустимых для префикса команды.
-
Cmd.lastcmd¶ Последний непустой префикс команды.
-
Cmd.cmdqueue¶ Список поставленных в очередь строк ввода. Список
cmdloop()проверяется, когда требуется новый ввод; если он не пуст, его элементы обрабатываются по порядку, как если бы они были введены в приглашении.
-
Cmd.intro¶ Строка, выводимая как приветствие или баннер. Может быть переопределена путём передачи аргумента методу
cmdloop().
-
Cmd.doc_header¶ Заголовок, выводимый, если в выводе справки есть раздел для документированных команд.
-
Cmd.misc_header¶ Заголовок, выводимый, если в выводе справки есть раздел для прочих тем (то есть существуют методы
help_*()без соответствующих методовdo_*()).
-
Cmd.undoc_header¶ Заголовок, выводимый, если в выводе справки есть раздел для недокументированных команд (то есть существуют методы
do_*()без соответствующих методовhelp_*()).
-
Cmd.ruler¶ Символ, используемый для рисования разделительных линий под заголовками сообщений справки. Если пусто, линия не рисуется. По умолчанию равен
'='.
-
Cmd.use_rawinput¶ Флаг, по умолчанию истинный. Если истина,
cmdloop()используетraw_input()для отображения приглашения и чтения следующей команды; если ложь, используютсяsys.stdout.write()иsys.stdin.readline(). (Это означает, что импортировавreadline, на поддерживающих это системах интерпретатор автоматически получит поддержку редактирования строк в стиле Emacs и клавиш истории команд.)