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

Как операционная система находит Python?

1.0 Junior🔥 91 комментариев
#DevOps и инфраструктура#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как операционная система находит Python?

Это фундаментальный вопрос о том, как работает командная строка, шебанги и PATH переменная. Рассмотрю детально.

1. Переменная окружения PATH

ОС ищет программы в папках, перечисленных в переменной PATH:

# Посмотри содержимое PATH
echo $PATH
# Результат: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# Это означает:
# - Сначала проверить /usr/local/bin
# - Потом /usr/bin
# - Потом /bin
# И так далее...

# Где находится python?
which python
# /usr/bin/python

# Где находится python3?
which python3
# /usr/local/bin/python3

Алгоритм поиска:

  1. ОС берёт команду python
  2. Проходит по каждой папке в PATH
  3. Ищет файл с именем python
  4. Когда находит — запускает его
  5. Если не находит нигде — выдаёт "command not found"

2. Проверка версий Python

# На одной машине может быть несколько версий Python
ls /usr/bin/python*
# /usr/bin/python
# /usr/bin/python2
# /usr/bin/python3
# /usr/bin/python3.8
# /usr/bin/python3.9
# /usr/bin/python3.11

# Какая версия используется по умолчанию?
python --version
# Python 3.9.7

# Это символическая ссылка
ls -la /usr/bin/python
# /usr/bin/python -> python3

ls -la /usr/bin/python3
# /usr/bin/python3 -> python3.11

3. Shebang (#!) для скриптов

Верхняя строка скрипта указывает, какой интерпретатор использовать:

#!/usr/bin/env python3
# ^ Это называется shebang или hashbang

print("Hello, World!")

Как это работает:

# Запуск скрипта
./script.py

# ОС смотрит первую строку: #!/usr/bin/env python3
# Находит python3 через command \`env\`
# Запускает его с аргументом script.py
# Эквивалентно:
python3 ./script.py

4. Команда `env` для поиска программ

# env ищет программу в PATH
env python3 --version
# Python 3.11.0

# Это надежнее, чем hardcode пути:
# ❌ #!/usr/bin/python3 (может не существовать на другой ОС)
# ✅ #!/usr/bin/env python3 (найдет python3 где угодно)

# env также может задать переменные окружения
env PYTHONUNBUFFERED=1 python script.py

5. Поиск модулей Python (sys.path)

Опосредственно, когда Python запущен, он ищет модули в определённых местах:

import sys
print(sys.path)
# [\n  /home/user/project,
#  /usr/lib/python3.11,
#  /usr/lib/python3.11/lib-dynload,
#  /usr/local/lib/python3.11/site-packages,
#  /usr/lib/python3/dist-packages
# ]

# PYTHONPATH переменная окружения
echo $PYTHONPATH
# (обычно пусто)

# Но можешь добавить:
export PYTHONPATH=/home/user/my_modules:$PYTHONPATH
python script.py

6. Virtual Environment (venv)

Изолированная среда с отдельным Python:

# Создание venv
python3 -m venv venv

# Активация
source venv/bin/activate
# (На Windows: venv\\Scripts\\activate)

# Что произошло?
echo $PATH
# /home/user/project/venv/bin:/usr/bin:...
# ^ venv/bin в начале PATH

# Теперь который python используется?
which python
# /home/user/project/venv/bin/python
# ^ Python из venv, не системный!

# Это возможно, потому что venv содержит копию Python:
ls venv/bin/
# python -> python3.11

7. Путь поиска на разных ОС

Linux/macOS:

echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# Где обычно находится Python
which python3
# /usr/bin/python3 или /usr/local/bin/python3

Windows:

echo %PATH%
REM C:\Python311;C:\Users\User\AppData\Local\Programs\Python\Python311\Scripts;...

where python
REM C:\Users\User\AppData\Local\Programs\Python\Python311\python.exe

8. Установка Python в PATH

Когда устанавливаешь Python из исходников:

# Загрузи Python
wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz
tar xzf Python-3.11.0.tgz
cd Python-3.11.0

# Компилируй
./configure --prefix=/usr/local
make
make install

# Результат: Python установлен в /usr/local/bin/python3
# /usr/local/bin обычно в PATH, поэтому python3 найдётся

which python3
# /usr/local/bin/python3

9. Проблема: "python: command not found"

# Проблема 1: Python не установлен
which python3
# (пусто)

# Решение: Установить Python
sudo apt install python3  # Linux
brew install python3     # macOS

# Проблема 2: Python есть, но не в PATH
ls /opt/python3.11/bin/python3
# Существует, но не в PATH

# Решение: Добавить в PATH
export PATH=/opt/python3.11/bin:$PATH
python3 --version
# Теперь работает

# Или создать символическую ссылку
sudo ln -s /opt/python3.11/bin/python3 /usr/local/bin/python3

10. Скрипт: поиск всех установленных Python

#!/bin/bash
# Найти все версии Python в системе

echo "Python в PATH:"
which python python2 python3 2>/dev/null || echo "None"

echo "\nВсе Python в /usr/bin:"
ls -la /usr/bin/python* 2>/dev/null || echo "None"

echo "\nВсе Python в /usr/local/bin:"
ls -la /usr/local/bin/python* 2>/dev/null || echo "None"

echo "\nВсе Python в /opt:"
find /opt -name "python*" -type f 2>/dev/null || echo "None"

echo "\nPYTHONPATH:"
echo $PYTHONPATH

11. Используемая версия при запуске

# script.py
import sys

print(f"Python executable: {sys.executable}")
print(f"Python version: {sys.version}")
print(f"Python prefix: {sys.prefix}")

# Запуск
python3 script.py
# Python executable: /usr/bin/python3
# Python version: 3.11.0 ...
# Python prefix: /usr

Практический пример: Различные способы запуска

# 1. С явным путём
/usr/bin/python3 script.py

# 2. Через env (рекомендуется)
/usr/bin/env python3 script.py

# 3. Если script.py имеет shebang и executable права
chmod +x script.py
./script.py
# Использует интерпретатор из shebang

# 4. Из venv
/home/user/project/venv/bin/python script.py

# 5. Если venv активирован
source venv/bin/activate
python script.py
# Использует python из venv

Чек-лист понимания

  • Знаю, где находится Python: which python3
  • Понимаю PATH и как ОС ищет программы
  • Знаю различие между python, python2, python3
  • Могу использовать shebang в скриптах
  • Знаю про venv и изоляцию окружений
  • Понимаю sys.path и где Python ищет модули
  • Могу добавить папку в PATH
  • Знаю про env для поиска программ
  • Могу отладить "command not found" проблемы

ОС не "находит" Python волшебным образом. Она просто следует простому алгоритму поиска через PATH переменную, которая определяет, где искать программы.