← Назад к вопросам

Что происходит при выполнении команды 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 в консоли:

  1. Запускается интерпретатор — инициализируется CPython
  2. Загружаются встроенные модули — builtins, sys, os и т.д.
  3. Запускается REPL — бесконечный цикл READ-EVAL-PRINT
  4. Ждёт ввода — приглашение >>>
  5. При вводе команды:
    • READ — читает строку
    • PARSE — преобразует в AST
    • COMPILE — компилирует в bytecode
    • EXECUTE — выполняет bytecode на VM
    • PRINT — выводит результат (если есть)
  6. Продолжает работу — ждёт новой команды
  7. При exit() — завершает работу

REPL идеален для:

  • Обучения
  • Экспериментов
  • Отладки
  • Быстрых вычислений

Для скриптов используй файлы (script.py) — это работает совсем иначе.

Что происходит при выполнении команды python в консоли? | PrepBro