← Назад к вопросам
Что происходит при выполнении команды python в консоли?
2.2 Middle🔥 91 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что происходит при выполнении команды python в консоли
Простейший случай
$ python
Это запускает интерпретатор Python в интерактивном режиме (REPL — Read-Eval-Print Loop).
Пошаговый процесс
Шаг 1: Запуск интерпретатора
$ python # Или python3
# ОС находит исполняемый файл python
# (обычно /usr/bin/python или /usr/local/bin/python)
Шаг 2: Инициализация
# Python инициализирует:
# 1. Виртуальная машина CPython
vm = CPythonVM()
# 2. Встроенные типы
builtin_types = [
int, # Целые числа
str, # Строки
list, # Списки
dict, # Словари
# ... и т.д.
]
# 3. Встроенные функции
builtins = [
print,
len,
range,
open,
# ... и т.д.
]
# 4. Модули
import sys
import os
# ... и другие
# 5. Переменные окружения
SYS.PATH = [ # Где искать модули
'', # Текущая директория
'/usr/lib/python3.x',
'/usr/lib/python3.x/lib-dynload',
# ... и т.д.
]
Шаг 3: Запуск REPL
# REPL — это бесконечный loop
Python 3.11.0 (main, Oct 4 2023, 14:18:14)
[GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
# Приглашение ">>>" ждёт ввода
Что происходит при вводе команды
Пример: ввести print("Hello")
>>> print("Hello")
# 1. READ — прочитать строку
# input_string = "print(\"Hello\")"
# 2. PARSE — парсить в AST (Abstract Syntax Tree)
# ast.parse(input_string) →
# Module(
# body=[
# Expr(
# value=Call(
# func=Name(id='print'),
# args=[Constant(value='Hello')]
# )
# )
# ]
# )
# 3. COMPILE — компилировать в bytecode
# code_object = compile(ast, '<stdin>', 'single')
#
# bytecode:
# LOAD_NAME 0 (print)
# LOAD_CONST 0 ('Hello')
# CALL_FUNCTION 1
# PRINT_EXPR
# RETURN_VALUE
# 4. EXECUTE — выполнить bytecode
# vm.execute(code_object)
# → print("Hello")
# → Hello
# 5. PRINT — вывести результат
# Hello
Детальный процесс: READ-EVAL-PRINT
READ (Чтение)
# REPL ждёт ввода
# >>> x = 5
# Парсер читает строку до newline
line = "x = 5"
EVAL (Вычисление / Выполнение)
# 1. Tokenization (разбиение на токены)
tokens = [
Token(NAME, 'x'),
Token(EQUAL, '='),
Token(NUMBER, '5')
]
# 2. Parsing (построение AST)
ast = parse_tokens(tokens)
# Assignment(target=Name(id='x'), value=Constant(value=5))
# 3. Compilation (компилирование в bytecode)
bytecode = compile_ast(ast)
# LOAD_CONST 5
# STORE_NAME x
# LOAD_CONST None
# RETURN_VALUE
# 4. Execution (выполнение)
vm.execute(bytecode)
# Переменная x создаётся с значением 5
PRINT (Вывод)
# Если есть результат выражения, выводим
result = execute(code)
# result = None (для присваивания)
# REPL не выводит None
# Но если:
# >>> 2 + 2
# 4
# REPL выводит результат
Несколько примеров
Пример 1: Присваивание (ничего не выводится)
>>> x = 5
>>> # Пусто (None не выводится)
Пример 2: Выражение (выводится результат)
>>> 2 + 2
4 # Результат выводится автоматически
>>> "hello".upper()
'HELLO'
Пример 3: Функция (возвращаемое значение)
>>> def greet():
... return "Hello"
...
>>> greet() # Функция вызывается
'Hello' # Результат выводится
>>> print("test") # print сам выводит
test
>>> # Результат print (None) не выводится
Память: переменные и объекты
# REPL сохраняет объекты в памяти
>>> x = [1, 2, 3]
# На память выделяется:
# - Объект list с элементами [1, 2, 3]
# - Переменная x указывает на этот объект
# Объект остаётся в памяти пока:
# 1. На него есть ссылка (x)
# 2. Или пока REPL не закрется
>>> y = x
# Теперь на объект две ссылки: x и y
>>> del x
# x удалена, но объект ещё в памяти (ссылка y остаётась)
>>> del y
# y удалена, ссылок нет
# Garbage Collector удалит объект
Встроенные переменные REPL
>>> 1 + 1
2
>>> _ # _ содержит последний результат
2
>>> "hello"
'hello'
>>> _ # Обновилась
'hello'
# Это полезно для продолжения работы
>>> _ + " world"
'hello world'
Ошибки в REPL
# SyntaxError — ошибка в синтаксисе
>>> print("hello
File "<stdin>", line 1
print("hello
SyntaxError: EOL while scanning string literal
# REPL продолжает работу
>>>
# NameError — переменная не определена
>>> print(undefined_variable)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'undefined_variable' is not defined
# Но REPL продолжает работу
>>>
# ZeroDivisionError — деление на ноль
>>> 1 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
# REPL продолжает работу
Системные команды
>>> help() # Справка
# Открывает интерактивную справку
>>> exit() # Выход
# или Ctrl+D (Unix) / Ctrl+Z + Enter (Windows)
>>> dir() # Список переменных в текущем scope
['__builtins__', '__doc__', '__loader__', '__name__', ...]
>>> dir(str) # Методы объекта
['__add__', '__class__', '__contains__', ...]
>>> import sys
>>> sys.exit() # Выход из программы
Ввод многострочного кода
>>> if True:
... print("Hello") # ... означает продолжение
... print("World")
... # Пустая строка завершает блок
Hello
World
>>> def factorial(n):
... if n == 0:
... return 1
... return n * factorial(n - 1)
...
>>> factorial(5)
120
Запуск скрипта (другой случай)
$ python script.py
# 1. ОС запускает python с аргументом script.py
# 2. Python читает файл script.py
# 3. Парсит, компилирует, выполняет
# 4. Завершает работу
IPython vs Standard REPL
# Standard REPL (python)
>>> x = 5
>>> x
5
# IPython (лучше)
In [1]: x = 5
In [2]: x
Out[2]: 5
# IPython имеет преимущества:
# - Подсветка синтаксиса
# - Автодополнение (Tab)
# - Магические команды (%)
# - Истории команд
# - Встроенная отладка
Заключение
При выполнении python в консоли:
- Запускается интерпретатор — инициализируется CPython
- Загружаются встроенные модули — builtins, sys, os и т.д.
- Запускается REPL — бесконечный цикл READ-EVAL-PRINT
- Ждёт ввода — приглашение >>>
- При вводе команды:
- READ — читает строку
- PARSE — преобразует в AST
- COMPILE — компилирует в bytecode
- EXECUTE — выполняет bytecode на VM
- PRINT — выводит результат (если есть)
- Продолжает работу — ждёт новой команды
- При
exit()— завершает работу
REPL идеален для:
- Обучения
- Экспериментов
- Отладки
- Быстрых вычислений
Для скриптов используй файлы (script.py) — это работает совсем иначе.