Где хранятся сторонние модули Python

Раздел: Системное администрирование -> Файловый ввод-вывод

Каталог site-packages содержит сторонние модули и пакеты, установленные через pip или другие менеджеры. Знание его расположения важно для отладки, настройки путей импорта и администрирования систем.

Основной способ: использование sysconfig

Как получить точный путь к site-packages для текущего интерпретатора?

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

python -c "import sysconfig; print(sysconfig.get_paths()['purelib'])"

ввод программ на python (ввод данных в программе python)

/usr/lib/python3.10/site-packages

Python file io (ввод-вывод файлов в python)

Пояснение:

Команда запускает интерпретатор с коротким скриптом. Результат показывает полный путь. Если необходимо получить оба варианта (purelib и platlib), можно вывести словарь целиком или оба ключа.

Возможные проблемы:

  • В некоторых старых версиях Python (до 3.2) модуль sysconfig отсутствует. Тогда используется модуль distutils.sysconfig.
  • Если интерпретатор собран с нестандартной конфигурацией, ключ 'purelib' может отсутствовать. В таких случаях следует обратиться к get_config_var('LIBDIR') и сформировать путь вручную.
  • В виртуальных окружениях (virtualenv, venv) этот путь указывает на site-packages внутри окружения, что является ожидаемым.

Какие пути содержит sys.path, включая site-packages?

Список sys.path формируется при запуске интерпретатора. В него входят каталоги, в которых Python ищет модули. Чтобы выделить именно site-packages, можно отфильтровать элементы, содержащие слово 'site-packages'.

python -c "import sys; paths = [p for p in sys.path if 'site-packages' in p]; print('\n'.join(paths))"

Python temp files (временные файлы в python)

/home/user/.local/lib/python3.10/site-packages
/usr/lib/python3.10/site-packages

Python index files (индексация файлов в python)

Пояснение:

В результате отображаются все каталоги, где в имени встречается 'site-packages'. Это могут быть глобальный и пользовательский пути. Порядок следования влияет на приоритет импорта.

Ошибки:

  • Если Python был запущен с опцией -S, site-packages может не добавляться в sys.path. Тогда фильтрация ничего не даст.
  • На macOS и Linux пользовательский путь может отсутствовать, если не был создан. Вместо этого используется только глобальный.

Как получить список глобальных site-packages?

Модуль site предоставляет функцию get_getsitepackages() (правильно getsitepackages? Название site.getsitepackages()). Она возвращает список из одного или двух путей (в зависимости от конфигурации) для глобально установленных пакетов.

python -c "import site; print(site.getsitepackages())"

File python class (класс для работы с файлами в python)

['/usr/lib/python3.10/site-packages']

Python file utf 8 (кодировка utf-8 для файлов в python)

Пояснение:

Функция возвращает список, так как в некоторых системах может быть два каталога (например, для архитектурно-зависимых и независимых модулей). Для получения пользовательского пути используйте site.getusersitepackages().

Проблемы:

  • В виртуальных окружениях site.getsitepackages() может выдать пустой список или пути не соответствующие действительности (в некоторых реализациях virtualenv). Лучше использовать sysconfig.
  • На Windows функция возвращает пути с обратными слэшами, что может потребовать нормализации.

Как вывести всю информацию о site-packages одной командой?

Запуск интерпретатора с опцией -m site отображает sys.path, а также глобальные и пользовательские пути site-packages.

python -m site

Python config files (конфигурационные файлы в python)

sys.path = [
    '/home/user/project',
    '/usr/lib/python3.10',
    ...
    '/usr/lib/python3.10/site-packages',
]
USER_BASE: '/home/user/.local' (exists)
USER_SITE: '/home/user/.local/lib/python3.10/site-packages' (exists)
ENABLE_USER_SITE: True

Python copy file (копирование файла в python)

Пояснение:

Вывод содержит переменные USER_BASE, USER_SITE, а также статус существования каталогов. Это удобно для быстрой диагностики.

Особенности:

  • Если каталог USER_SITE не существует, он будет помечен как несуществующий, но Python всё равно может добавлять его в sys.path.
  • Вывод может быть большим и менее удобным для автоматической обработки, чем прямое обращение к модулю.

Как узнать, в каком site-packages установлен конкретный пакет?

Команда pip show отображает метаданные пакета, включая полный путь к каталогу модуля. Это позволяет определить, какой из нескольких site-packages используется для данного пакета.

pip show requests | grep Location

Python log file (логирование в файл в python)

Location: /home/user/venv/lib/python3.10/site-packages

Python file methods (методы работы с файлами в python)

Пояснение:

В выводе команды есть поле Location. С его помощью можно однозначно определить, откуда загружается модуль. Это особенно полезно при наличии дублирующихся версий или конфликтов.

Проблемы:

  • Если пакет не установлен, команда выдаст ошибку. Следует предварительно проверить наличие.
  • Для установок через conda или другие менеджеры pip может не показывать корректный путь.

Как определить пользовательский site-packages (--user)?

Для установки пакетов только для текущего пользователя используется команда pip install --user. Путь к пользовательскому site-packages можно получить с помощью site.getusersitepackages() или из переменной окружения PYTHONUSERBASE.

python -c "import site; print(site.getusersitepackages())"

File models in python (модели файлов в python)

/home/user/.local/lib/python3.10/site-packages

Пояснение:

Этот путь автоматически добавляется в sys.path, если включена опция user-site. Его можно переопределить через переменную окружения PYTHONUSERBASE.

Проблемы:

  • Пользовательский каталог может не существовать до первой установки пакета с --user. В этом случае site.getusersitepackages() вернёт путь, но каталог будет отсутствовать.
  • На системах с управляемыми пользовательскими окружениями (например, macOS с SIP) этот путь может быть недоступен для записи.
- Python file position (позиционирование в файле python)
- Python line find (поиск строки в файле python)
- Python csv file (работа с csv файлами в python)

Расширенные примеры работы с путями site-packages

Пример
import sysconfig, site, sys
paths = {
    'purelib': sysconfig.get_paths().get('purelib'),
    'platlib': sysconfig.get_paths().get('platlib'),
    'getsitepackages': site.getsitepackages(),
    'usersitepackages': site.getusersitepackages(),
    'sys.path filtered': [p for p in sys.path if 'site-packages' in p]
}
for k, v in paths.items():
    print(f"{k}: {v}")
purelib: /usr/lib/python3.10/site-packages
platlib: /usr/lib/python3.10/site-packages
getsitepackages: ['/usr/lib/python3.10/site-packages']
usersitepackages: /home/user/.local/lib/python3.10/site-packages
sys.path filtered: ['/home/user/.local/lib/python3.10/site-packages', '/usr/lib/python3.10/site-packages']

Скрипт объединяет несколько методов и может быть использован для автоматизации диагностики.

Пример
import subprocess, json
# получить список всех доступных версий Python
versions = subprocess.check_output(['pyenv', 'versions', '--bare'], text=True).split()
for ver in versions:
    path = subprocess.check_output(['pyenv', 'which', f'python{ver}'], text=True).strip()
    # можно вызвать python -c с этой версией, указав полный путь
    result = subprocess.check_output([path, '-c', 'import sysconfig; print(sysconfig.get_paths()["purelib"])'], text=True).strip()
    print(f"{ver}: {result}")
3.8.12: /home/user/.pyenv/versions/3.8.12/lib/python3.8/site-packages
3.10.4: /home/user/.pyenv/versions/3.10.4/lib/python3.10/site-packages

Этот подход полезен в окружениях с несколькими версиями, управляемыми pyenv или conda.

Пример
import os, sysconfig
real_path = os.path.realpath(sysconfig.get_paths()['purelib'])
print(f"Реальный путь: {real_path}")
# сравнить с исходным
print(f"Исходный путь: {sysconfig.get_paths()['purelib']}")
Реальный путь: /mnt/data/python3.10/site-packages
Исходный путь: /usr/lib/python3.10/site-packages

Если site-packages является символической ссылкой, os.path.realpath вернёт фактическое местоположение. Это важно при монтировании томов или контейнеризации.

Пример
pip install requests --target /custom/path/site-packages
# затем добавить этот путь в sys.path
import sys
sys.path.insert(0, '/custom/path/site-packages')
import requests
print(requests.__file__)
/custom/path/site-packages/requests/__init__.py

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

Пример
import sysconfig
# получить все схемы
schemes = sysconfig.get_scheme_names()
print("Доступные схемы:", schemes)
# для конкретной схемы
paths = sysconfig.get_paths(scheme='posix_user')
print("Пути для пользовательской схемы:", paths)
Доступные схемы: ('posix_prefix', 'posix_user', 'nt')
Пути для пользовательской схемы: {'stdlib': '...', 'platstdlib': '...', 'purelib': '/home/user/.local/lib/python3.10/site-packages', ...}

Это продвинутый метод для полного контроля над интерпретацией путей.

Пример
import subprocess
executable = '/usr/bin/python3.8'
path = subprocess.check_output([executable, '-c', 'import sysconfig; print(sysconfig.get_paths()["purelib"])'], text=True).strip()
print(path)
/usr/lib/python3.8/site-packages

Поиск site-packages для другого интерпретатора путём запуска скрипта от его имени.

Путь к site-packages в Python - comments

En
Python site packages path (python)