Где хранятся сторонние модули 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 sitePython 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: TruePython copy file (копирование файла в python)
Пояснение:
Вывод содержит переменные USER_BASE, USER_SITE, а также статус существования каталогов. Это удобно для быстрой диагностики.
Особенности:
- Если каталог USER_SITE не существует, он будет помечен как несуществующий, но Python всё равно может добавлять его в sys.path.
- Вывод может быть большим и менее удобным для автоматической обработки, чем прямое обращение к модулю.
Как узнать, в каком site-packages установлен конкретный пакет?
Команда pip show отображает метаданные пакета, включая полный путь к каталогу модуля. Это позволяет определить, какой из нескольких site-packages используется для данного пакета.
pip show requests | grep LocationPython 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) этот путь может быть недоступен для записи.
Расширенные примеры работы с путями 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 для другого интерпретатора путём запуска скрипта от его имени.