cmd.md
1> **Источник:** https://python-all.ru/2.7/library/cmd.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 23.1. [`cmd`](https://python-all.ru/2.7/library/cmd.html#module-cmd) – Поддержка построчных интерпретаторов команд89**Исходный код:** [Lib/cmd.py](https://python-all.ru/src/2.7/Lib/cmd.py)1011---1213Класс [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) предоставляет простую основу для написания построчных интерпретаторов команд. Они часто полезны для тестовых стендов, административных инструментов и прототипов, которые позже будут обёрнуты в более сложный интерфейс.1415#### `class cmd.Cmd([completekey[, stdin[, stdout]]])`1617Экземпляр [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) или экземпляр подкласса представляет собой каркас построчного интерпретатора. Нет веских причин создавать экземпляр самого [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); напротив, его удобно использовать как суперкласс для собственного класса интерпретатора, чтобы наследовать методы [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) и инкапсулировать методы действий.1819Необязательный аргумент *completekey* – это имя клавиши автодополнения [`readline`](https://python-all.ru/2.7/library/readline.html#module-readline); по умолчанию оно равно `Tab`. Если *completekey* не равно [`None`](https://python-all.ru/2.7/library/constants.html#None) и доступен [`readline`](https://python-all.ru/2.7/library/readline.html#module-readline), автодополнение команд выполняется автоматически.2021Необязательные аргументы *stdin* и *stdout* задают объекты файлов ввода и вывода, которые экземпляр Cmd или экземпляр подкласса будет использовать для ввода и вывода. Если они не указаны, по умолчанию используются [`sys.stdin`](https://python-all.ru/2.7/library/sys.html#sys.stdin) и [`sys.stdout`](https://python-all.ru/2.7/library/sys.html#sys.stdout).2223Если требуется использовать определённый *stdin*, убедитесь, что атрибут [`use_rawinput`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.use_rawinput) экземпляра установлен в `False`, иначе *stdin* будет проигнорирован.2425Изменено в версии 2.3: Добавлены параметры *stdin* и *stdout*.2627## 23.1.1. Объекты Cmd2829Экземпляр [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) имеет следующие методы:3031#### `Cmd.cmdloop([intro])`3233Многократно выводит приглашение, принимает ввод, выделяет из полученного ввода начальный префикс и передаёт его методам действий, передавая им остаток строки в качестве аргумента.3435Необязательный аргумент – это строка баннера или вступления, которая выводится перед первым приглашением (это переопределяет атрибут класса [`intro`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.intro)).3637Если модуль [`readline`](https://python-all.ru/2.7/library/readline.html#module-readline) загружен, ввод будет автоматически поддерживать редактирование списка истории в стиле **bash** (например, `Control-P` прокручивает назад к последней команде, `Control-N` – вперёд к следующей, `Control-F` перемещает курсор вправо без удаления, `Control-B` перемещает курсор влево без удаления и т.д.).3839Признак конца файла на вводе передаётся обратно в виде строки `'EOF'`.4041Экземпляр интерпретатора распознаёт имя команды `foo` только в том случае, если у него есть метод `do_foo()`. В частном случае строка, начинающаяся с символа `'?'`, передаётся методу `do_help()`. В другом частном случае строка, начинающаяся с символа `'!'`, передаётся методу `do_shell()` (если такой метод определён).4243Этот метод завершается, когда метод [`postcmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.postcmd) возвращает истинное значение. Аргумент *stop* для [`postcmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.postcmd) – это возвращаемое значение соответствующего метода команды `do_*()`.4445Если автодополнение включено, дополнение команд выполняется автоматически, а дополнение аргументов команд – вызовом `complete_foo()` с аргументами *text*, *line*, *begidx* и *endidx*. *text* – это строковый префикс, который мы пытаемся сопоставить: все возвращённые совпадения должны с него начинаться. *line* – текущая строка ввода с удалёнными начальными пробелами, *begidx* и *endidx* – начальный и конечный индексы текста префикса, которые могут использоваться для разного дополнения в зависимости от позиции аргумента.4647Все подклассы [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) наследуют предопределённый `do_help()`. Этот метод, вызванный с аргументом `'bar'`, вызывает соответствующий метод `help_bar()`, а если его нет, выводит строку документации `do_bar()`, если она доступна. Без аргументов `do_help()` выводит список всех доступных тем справки (то есть всех команд, у которых есть соответствующие методы `help_*()` или строки документации), а также перечисляет недокументированные команды.4849#### `Cmd.onecmd(str)`5051Интерпретирует аргумент так, как если бы он был введён в ответ на приглашение. Этот метод можно переопределить, но обычно в этом нет необходимости; см. методы [`precmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.precmd) и [`postcmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.postcmd) для полезных точек выполнения. Возвращаемое значение – флаг, указывающий, должна ли интерпретация команд интерпретатором остановиться. Если для команды *str* существует метод `do_*()`, возвращается его значение, иначе возвращается значение из метода [`default()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.default).5253#### `Cmd.emptyline()`5455Метод, вызываемый, когда в ответ на приглашение введена пустая строка. Если этот метод не переопределён, он повторяет последнюю введённую непустую команду.5657#### `Cmd.default(line)`5859Метод, вызываемый для строки ввода, когда префикс команды не распознан. Если этот метод не переопределён, он выводит сообщение об ошибке и завершается.6061#### `Cmd.completedefault(text, line, begidx, endidx)`6263Метод, вызываемый для автодополнения строки ввода, когда нет доступного метода `complete_*()`, специфичного для команды. По умолчанию возвращает пустой список.6465#### `Cmd.precmd(line)`6667Метод-перехватчик, выполняемый непосредственно перед интерпретацией командной строки *line*, но после того, как приглашение ввода сгенерировано и выведено. Этот метод – заглушка в [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); он существует для переопределения в подклассах. Возвращаемое значение используется как команда, которая будет выполнена методом [`onecmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.onecmd); реализация [`precmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.precmd) может переписать команду или просто вернуть *line* без изменений.6869#### `Cmd.postcmd(stop, line)`7071Метод-перехватчик, выполняемый сразу после завершения диспетчеризации команды. Этот метод – заглушка в [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); он существует для переопределения в подклассах. *line* – это командная строка, которая была выполнена, а *stop* – флаг, указывающий, будет ли выполнение завершено после вызова [`postcmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.postcmd); это будет возвращаемым значением метода [`onecmd()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.onecmd). Возвращаемое значение этого метода будет использоваться как новое значение внутреннего флага, соответствующего *stop*; возврат false приведёт к продолжению интерпретации.7273#### `Cmd.preloop()`7475Метод-перехватчик, выполняемый один раз при вызове [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop). Этот метод – заглушка в [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); он существует для переопределения в подклассах.7677#### `Cmd.postloop()`7879Метод-перехватчик, выполняемый один раз, когда [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop) собирается вернуть управление. Этот метод – заглушка в [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd); он существует для переопределения в подклассах.8081Экземпляры подклассов [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) имеют несколько открытых переменных экземпляра:8283#### `Cmd.prompt`8485Приглашение, выводимое для запроса ввода.8687#### `Cmd.identchars`8889Строка символов, допустимых для префикса команды.9091#### `Cmd.lastcmd`9293Последний непустой префикс команды.9495#### `Cmd.cmdqueue`9697Список поставленных в очередь строк ввода. Список [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop) проверяется, когда требуется новый ввод; если он не пуст, его элементы обрабатываются по порядку, как если бы они были введены в приглашении.9899#### `Cmd.intro`100101Строка, выводимая как приветствие или баннер. Может быть переопределена путём передачи аргумента методу [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop).102103#### `Cmd.doc_header`104105Заголовок, выводимый, если в выводе справки есть раздел для документированных команд.106107#### `Cmd.misc_header`108109Заголовок, выводимый, если в выводе справки есть раздел для прочих тем (то есть существуют методы `help_*()` без соответствующих методов `do_*()`).110111#### `Cmd.undoc_header`112113Заголовок, выводимый, если в выводе справки есть раздел для недокументированных команд (то есть существуют методы `do_*()` без соответствующих методов `help_*()`).114115#### `Cmd.ruler`116117Символ, используемый для рисования разделительных линий под заголовками сообщений справки. Если пусто, линия не рисуется. По умолчанию равен `'='`.118119#### `Cmd.use_rawinput`120121Флаг, по умолчанию истинный. Если истина, [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop) использует [`raw_input()`](https://python-all.ru/2.7/library/functions.html#raw_input) для отображения приглашения и чтения следующей команды; если ложь, используются `sys.stdout.write()` и `sys.stdin.readline()`. (Это означает, что импортировав [`readline`](https://python-all.ru/2.7/library/readline.html#module-readline), на поддерживающих это системах интерпретатор автоматически получит поддержку редактирования строк в стиле **Emacs** и клавиш истории команд.)122