> **Источник:** https://python-all.ru/2.7/library/cmd.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 23.1. [`cmd`](https://python-all.ru/2.7/library/cmd.html#module-cmd) – Поддержка построчных интерпретаторов команд

**Исходный код:** [Lib/cmd.py](https://python-all.ru/src/2.7/Lib/cmd.py)

---

Класс [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) предоставляет простую основу для написания построчных интерпретаторов команд. Они часто полезны для тестовых стендов, административных инструментов и прототипов, которые позже будут обёрнуты в более сложный интерфейс.

#### `class cmd.Cmd([completekey[, stdin[, stdout]]])`

Экземпляр [`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) и инкапсулировать методы действий.

Необязательный аргумент *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), автодополнение команд выполняется автоматически.

Необязательные аргументы *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).

Если требуется использовать определённый *stdin*, убедитесь, что атрибут [`use_rawinput`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.use_rawinput) экземпляра установлен в `False`, иначе *stdin* будет проигнорирован.

Изменено в версии 2.3: Добавлены параметры *stdin* и *stdout*.

## 23.1.1. Объекты Cmd

Экземпляр [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) имеет следующие методы:

#### `Cmd.cmdloop([intro])`

Многократно выводит приглашение, принимает ввод, выделяет из полученного ввода начальный префикс и передаёт его методам действий, передавая им остаток строки в качестве аргумента.

Необязательный аргумент – это строка баннера или вступления, которая выводится перед первым приглашением (это переопределяет атрибут класса [`intro`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.intro)).

Если модуль [`readline`](https://python-all.ru/2.7/library/readline.html#module-readline) загружен, ввод будет автоматически поддерживать редактирование списка истории в стиле **bash** (например, `Control-P` прокручивает назад к последней команде, `Control-N` – вперёд к следующей, `Control-F` перемещает курсор вправо без удаления, `Control-B` перемещает курсор влево без удаления и т.д.).

Признак конца файла на вводе передаётся обратно в виде строки `'EOF'`.

Экземпляр интерпретатора распознаёт имя команды `foo` только в том случае, если у него есть метод `do_foo()`. В частном случае строка, начинающаяся с символа `'?'`, передаётся методу `do_help()`. В другом частном случае строка, начинающаяся с символа `'!'`, передаётся методу `do_shell()` (если такой метод определён).

Этот метод завершается, когда метод [`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_*()`.

Если автодополнение включено, дополнение команд выполняется автоматически, а дополнение аргументов команд – вызовом `complete_foo()` с аргументами *text*, *line*, *begidx* и *endidx*. *text* – это строковый префикс, который мы пытаемся сопоставить: все возвращённые совпадения должны с него начинаться. *line* – текущая строка ввода с удалёнными начальными пробелами, *begidx* и *endidx* – начальный и конечный индексы текста префикса, которые могут использоваться для разного дополнения в зависимости от позиции аргумента.

Все подклассы [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) наследуют предопределённый `do_help()`. Этот метод, вызванный с аргументом `'bar'`, вызывает соответствующий метод `help_bar()`, а если его нет, выводит строку документации `do_bar()`, если она доступна. Без аргументов `do_help()` выводит список всех доступных тем справки (то есть всех команд, у которых есть соответствующие методы `help_*()` или строки документации), а также перечисляет недокументированные команды.

#### `Cmd.onecmd(str)`

Интерпретирует аргумент так, как если бы он был введён в ответ на приглашение. Этот метод можно переопределить, но обычно в этом нет необходимости; см. методы [`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).

#### `Cmd.emptyline()`

Метод, вызываемый, когда в ответ на приглашение введена пустая строка. Если этот метод не переопределён, он повторяет последнюю введённую непустую команду.

#### `Cmd.default(line)`

Метод, вызываемый для строки ввода, когда префикс команды не распознан. Если этот метод не переопределён, он выводит сообщение об ошибке и завершается.

#### `Cmd.completedefault(text, line, begidx, endidx)`

Метод, вызываемый для автодополнения строки ввода, когда нет доступного метода `complete_*()`, специфичного для команды. По умолчанию возвращает пустой список.

#### `Cmd.precmd(line)`

Метод-перехватчик, выполняемый непосредственно перед интерпретацией командной строки *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* без изменений.

#### `Cmd.postcmd(stop, line)`

Метод-перехватчик, выполняемый сразу после завершения диспетчеризации команды. Этот метод – заглушка в [`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 приведёт к продолжению интерпретации.

#### `Cmd.preloop()`

Метод-перехватчик, выполняемый один раз при вызове [`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); он существует для переопределения в подклассах.

#### `Cmd.postloop()`

Метод-перехватчик, выполняемый один раз, когда [`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); он существует для переопределения в подклассах.

Экземпляры подклассов [`Cmd`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd) имеют несколько открытых переменных экземпляра:

#### `Cmd.prompt`

Приглашение, выводимое для запроса ввода.

#### `Cmd.identchars`

Строка символов, допустимых для префикса команды.

#### `Cmd.lastcmd`

Последний непустой префикс команды.

#### `Cmd.cmdqueue`

Список поставленных в очередь строк ввода. Список [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop) проверяется, когда требуется новый ввод; если он не пуст, его элементы обрабатываются по порядку, как если бы они были введены в приглашении.

#### `Cmd.intro`

Строка, выводимая как приветствие или баннер. Может быть переопределена путём передачи аргумента методу [`cmdloop()`](https://python-all.ru/2.7/library/cmd.html#cmd.Cmd.cmdloop).

#### `Cmd.doc_header`

Заголовок, выводимый, если в выводе справки есть раздел для документированных команд.

#### `Cmd.misc_header`

Заголовок, выводимый, если в выводе справки есть раздел для прочих тем (то есть существуют методы `help_*()` без соответствующих методов `do_*()`).

#### `Cmd.undoc_header`

Заголовок, выводимый, если в выводе справки есть раздел для недокументированных команд (то есть существуют методы `do_*()` без соответствующих методов `help_*()`).

#### `Cmd.ruler`

Символ, используемый для рисования разделительных линий под заголовками сообщений справки. Если пусто, линия не рисуется. По умолчанию равен `'='`.

#### `Cmd.use_rawinput`

Флаг, по умолчанию истинный. Если истина, [`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** и клавиш истории команд.)
