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

---

# 28.1. [`code`](https://python-all.ru/3.2/library/code.html#module-code) – Базовые классы интерпретатора

Модуль `code` предоставляет средства для реализации циклов «чтение-вычисление-вывод» (read-eval-print) в Python. В него входят два класса и вспомогательные функции, которые можно использовать для построения приложений, предоставляющих интерактивное приглашение интерпретатора.

#### `class code.InteractiveInterpreter(locals=None)`

Этот класс занимается разбором кода и состоянием интерпретатора (пространством имён пользователя); он не занимается буферизацией ввода, выводом приглашений или именованием входных файлов (имя файла всегда передаётся явно). Необязательный аргумент *locals* задаёт словарь, в котором будет выполняться код; по умолчанию он равен новому словарю с ключом `'__name__'`, установленным в `'__console__'`, и ключом `'__doc__'`, установленным в `None`.

#### `class code.InteractiveConsole(locals=None, filename="<console>")`

Тесно эмулирует поведение интерактивного интерпретатора Python. Этот класс строится на основе [`InteractiveInterpreter`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter) и добавляет приглашения с помощью знакомых `sys.ps1` и `sys.ps2`, а также буферизацию ввода.

#### `code.interact(banner=None, readfunc=None, local=None)`

Удобная функция для запуска цикла чтения-вычисления-вывода. Она создаёт новый экземпляр [`InteractiveConsole`](https://python-all.ru/3.2/library/code.html#code.InteractiveConsole) и, если указан *readfunc*, использует его в качестве метода `raw_input()`. Если указан *local*, он передаётся конструктору [`InteractiveConsole`](https://python-all.ru/3.2/library/code.html#code.InteractiveConsole) для использования в качестве пространства имён по умолчанию для цикла интерпретатора. Затем запускается метод [`interact()`](https://python-all.ru/3.2/library/code.html#code.interact) экземпляра, при этом *banner* передаётся в качестве баннера, если указан. Консольный объект после использования отбрасывается.

#### `code.compile_command(source, filename="<input>", symbol="single")`

Эта функция полезна для программ, которые хотят имитировать главный цикл интерпретатора Python (также известный как цикл чтение-вычисление-печать). Сложность заключается в определении того, когда пользователь ввёл неполную команду, которую можно дополнить, введя ещё текст (в отличие от полной команды или синтаксической ошибки). Эта функция *почти* всегда принимает то же решение, что и настоящий главный цикл интерпретатора.

*source* – строка с исходным кодом; *filename* – необязательное имя файла, из которого был прочитан источник, по умолчанию `'<input>'`; а *symbol* – необязательный начальный символ грамматики, который должен быть либо `'single'` (по умолчанию), либо `'eval'`.

Возвращает объект кода (то же, что и `compile(source, filename, symbol)`), если команда полная и корректная; `None` – если команда неполная; возбуждает [`SyntaxError`](https://python-all.ru/3.2/library/exceptions.html#SyntaxError), если команда полная и содержит синтаксическую ошибку, или возбуждает [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError) или [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError), если команда содержит недопустимый литерал.

## 28.1.1. Объекты интерактивного интерпретатора

#### `InteractiveInterpreter.runsource(source, filename="<input>", symbol="single")`

Компилирует и выполняет некоторый исходный код в интерпретаторе. Аргументы те же, что и для [`compile_command()`](https://python-all.ru/3.2/library/code.html#code.compile_command); по умолчанию для *filename* используется `'<input>'`, а для *symbol* – `'single'`. Может произойти одно из нескольких событий:

- Входные данные некорректны; [`compile_command()`](https://python-all.ru/3.2/library/code.html#code.compile_command) возбудил исключение ([`SyntaxError`](https://python-all.ru/3.2/library/exceptions.html#SyntaxError) или [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError)). При вызове метода [`showsyntaxerror()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.showsyntaxerror) будет напечатана трассировка синтаксической ошибки. [`runsource()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.
- Входные данные неполны, и требуется дополнительный ввод; [`compile_command()`](https://python-all.ru/3.2/library/code.html#code.compile_command) вернула `None`. [`runsource()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.runsource) возвращает `True`.
- Входные данные полны; [`compile_command()`](https://python-all.ru/3.2/library/code.html#code.compile_command) вернула объект кода. Код выполняется вызовом [`runcode()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.runcode) (который также обрабатывает исключения времени выполнения, за исключением [`SystemExit`](https://python-all.ru/3.2/library/exceptions.html#SystemExit)). [`runsource()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.

Возвращаемое значение можно использовать для выбора между `sys.ps1` и `sys.ps2` при выводе приглашения для следующей строки.

#### `InteractiveInterpreter.runcode(code)`

Выполняет объект кода. При возникновении исключения вызывается [`showtraceback()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.showtraceback) для отображения трассировки. Перехватываются все исключения, кроме [`SystemExit`](https://python-all.ru/3.2/library/exceptions.html#SystemExit), которому разрешено распространяться.

Примечание о [`KeyboardInterrupt`](https://python-all.ru/3.2/library/exceptions.html#KeyboardInterrupt): это исключение может возникнуть в других местах этого кода и не всегда перехватывается. Вызывающая сторона должна быть готова к его обработке.

#### `InteractiveInterpreter.showsyntaxerror(filename=None)`

Отображает только что возникшую синтаксическую ошибку. Трассировка стека не отображается, так как для синтаксических ошибок её нет. Если передан *filename*, он вставляется в исключение вместо имени файла по умолчанию, которое предоставляет парсер Python (поскольку при чтении из строки он всегда использует `'<string>'`). Вывод осуществляется методом [`write()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.write).

#### `InteractiveInterpreter.showtraceback()`

Отображает только что возникшее исключение. Первый элемент стека удаляется, так как он относится к реализации объекта интерпретатора. Вывод осуществляется методом [`write()`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter.write).

#### `InteractiveInterpreter.write(data)`

Записывает строку в поток стандартной ошибки (`sys.stderr`). Производные классы должны переопределять этот метод, чтобы обеспечить соответствующую обработку вывода по мере необходимости.

## 28.1.2. Объекты интерактивной консоли

Класс [`InteractiveConsole`](https://python-all.ru/3.2/library/code.html#code.InteractiveConsole) является подклассом [`InteractiveInterpreter`](https://python-all.ru/3.2/library/code.html#code.InteractiveInterpreter), поэтому он предоставляет все методы объектов интерпретатора, а также следующие дополнения.

#### `InteractiveConsole.interact(banner=None)`

Точно эмулирует интерактивную консоль Python. Необязательный аргумент banner задаёт приветствие, которое выводится перед первым взаимодействием; по умолчанию выводится приветствие, сходное с тем, что печатает стандартный интерпретатор Python, после чего в скобках указывается имя класса объекта консоли (чтобы не путать его с настоящим интерпретатором – настолько он близок!).

#### `InteractiveConsole.push(line)`

Передаёт строку исходного текста интерпретатору. Строка не должна содержать завершающий символ новой строки; она может содержать внутренние символы новой строки. Строка добавляется в буфер, и вызывается метод интерпретатора `runsource()` с объединённым содержимым буфера в качестве исходного кода. Если это указывает, что команда была выполнена или недействительна, буфер сбрасывается; в противном случае команда неполная, и буфер остаётся в том виде, в каком он был после добавления строки. Возвращаемое значение равно `True`, если требуется дополнительный ввод, и `False`, если строка была обработана каким-либо образом (это то же самое, что и `runsource()`).

#### `InteractiveConsole.resetbuffer()`

Удаляет любой необработанный исходный текст из входного буфера.

#### `InteractiveConsole.raw_input(prompt="")`

Выводит приглашение и читает строку. Возвращённая строка не включает завершающий символ новой строки. Если пользователь вводит последовательность клавиш EOF, возбуждается исключение [`EOFError`](https://python-all.ru/3.2/library/exceptions.html#EOFError). Базовая реализация читает из `sys.stdin`; подкласс может заменить её другой реализацией.
