Установка Python пакетов из локального репозитория
Установка локального пакета через pip
Когда требуется установить пакет, который не опубликован на PyPI, или нужно работать с собственной разработкой, используется установка из локального источника. В этом разделе рассмотрены основные способы и их особенности.
Основной способ установить локальный пакет - указать путь к директории, содержащей файлы setup.py или pyproject.toml (PEP 517/518). Команда:
pip install /полный/путь/к/пакету
pip install ./относительный/путь
pip install . # если находитесь в корне пакетаPip upgrade package python (обновление пакета через pip)
После выполнения pip находит файл setup.py (или pyproject.toml), читает метаданные и зависимости, затем копирует содержимое пакета в каталог site-packages текущей среды. Пакет становится доступен для импорта.
Типичная проблема:
Если в директории нет setup.py или pyproject.toml, pip выдаст ошибку ERROR: Directory '/path' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.. Решение - убедиться, что структура пакета корректна, или использовать установку из архива (см. ниже). Ещё одна частая ошибка - несоответствие версии Python: если пакет требует Python 3.8+, а используется Python 3.6, pip сообщит о неразрешимых зависимостях. В таком случае обновляют интерпретатор или создают виртуальное окружение с нужной версией.
Как установить пакет из скачанного архива (.tar.gz, .whl)?
Иногда пакет распространяется в виде архива, например, result.tar.gz или my_package-1.0-py3-none-any.whl. Установка выполняется прямой командой:
pip install /путь/к/архиву.tar.gz
pip install ./my_package-1.0-py3-none-any.whlPython pip update package (обновление пакета через pip update)
Для .whl файлов pip просто распаковывает колесо в site-packages. Для .tar.gz pip сначала распаковывает, затем собирает пакет (если это исходный дистрибутив). Такой способ удобен, когда нет доступа к директории с исходным кодом, но есть собранный артефакт.
Возможные ошибки:
При установке из исходного архива могут отсутствовать системные зависимости (например, компилятор C для пакетов с C-расширениями). Ошибка error: Microsoft Visual C++ 14.0 or greater is required решается установкой Build Tools. Для .whl-файлов важно, чтобы тег платформы (например, win_amd64, linux_x86_64) совпадал с архитектурой интерпретатора Python. Иначе возникает ERROR: *.whl is not a supported wheel on this platform. Поможет поиск подходящей сборки или сборка из исходников.
Как редактировать пакет без переустановки?
Для активной разработки используют «редактируемый» режим (develop mode) с флагом -e (editable). Команда:
pip install -e /путь/к/пакету
pip install -e . # из корня пакета
Python build package (сборка пакета python)
Pip создаёт ссылку на исходную директорию внутри site-packages, а не копирует файлы. Любые изменения в коде сразу видны при импорте без повторной установки. Это аналог команды python setup.py develop, но через современный pip.
Проблема:
Иногда после добавления новых файлов или подпакетов в режиме редактирования импорт может не находить их. Решение - либо перезапустить интерпретатор, либо выполнить pip install -e . повторно (pip обновит ссылки). Также, если пакет использует системные библиотеки (C-расширения), изменения в .so/.dll не подхватываются - требуется сборка. В таком случае лучше собирать колесо и устанавливать его заново.
Как установить пакет из локальной копии Git-репозитория?
Когда имеется локальный клон репозитория, его можно установить как обычную директорию с setup.py. Однако иногда требуется установить конкретную ветку или коммит. Pip поддерживает прямое указание локального пути:
pip install git+file:///полный/путь/к/репозиторию#egg=имя_пакетаPython download package (скачивание пакета python)
Флаг egg задаёт имя пакета (необязательно, если в setup.py указано). Можно добавить @branch или @commit_hash:
pip install git+file:///путь@develop#egg=my_package
pip install git+file:///путь@abc1234#egg=my_packagePython pip install local package (установка локального пакета через pip)
Этот способ полезен, когда репозиторий не содержит setup.py в корне (например, в монорепозитории), но на него ссылается git-подмодуль.
Ошибки:
Если в системе не установлен Git, команда упадёт с ERROR: Command errored out with exit status 128. Решение - установить Git или перейти на установку из архива. Также проверяют, что путь к репозиторию корректен (абсолютный, с file:///).
Как установить локальный пакет вместе с его зависимостями из requirements.txt?
Часто пакет перечисляет свои зависимости в файле requirements.txt. Для установки локального пакета и всех его зависимостей используется комбинация:
pip install --requirement requirements.txt /путь/к/пакетуPython install package version (установка пакета определенной версии в python)
Либо можно установить сначала пакет, а потом зависимости из requirements.txt. Однако удобнее, если пакет сам содержит install_requires в setup.py - тогда pip самостоятельно подтянет зависимости. Если же зависимости указаны только в requirements.txt, их нужно обрабатывать отдельно.
pip install -r requirements.txt && pip install ./my_packageмодули python linux (модули python в linux)
Или, если пакет находится в поддиректории, можно объединить:
pip install -r requirements.txt -e ./my_packageUpdate lib python (обновление библиотек python)
Проблема:
Зависимости могут конфликтовать с уже установленными версиями. Используют pip check после установки. Если конфликт возник, создают чистое виртуальное окружение. Другая проблема - если в requirements.txt указаны пакеты из внешних источников, а сеть недоступна. Тогда скачивают все зависимости заранее (pip download) и используют --find-links.
Как установить пакет из папки с предварительно собранными wheel-файлами?
Когда все зависимости и сам пакет собраны в виде .whl-файлов и помещены в одну локальную папку, удобно использовать --find-links вместе с --no-index:
pip install --no-index --find-links=/путь/к/папке/с/колесами my_packagePython packages list (список установленных пакетов)
Флаг --no-index запрещает обращение к PyPI, а --find-links указывает папку, где pip будет искать пакеты. Утилита pip download позволяет заранее собрать все колёса в указанную папку:
pip download --dest ./wheels my_package
pip install --no-index --find-links=./wheels my_packageЭтот вариант незаменим при установке на изолированных серверах без доступа в интернет.
Ошибки:
Если в локальной папке нет колёс для текущей платформы, pip сообщит ERROR: Could not find a version that satisfies the requirement my_package. Нужно убедиться, что wheel-файлы совместимы с архитектурой и версией Python. Также проверяют, что в папке есть все транзитивные зависимости - иначе pip будет ругаться на пропущенные пакеты.
Расширенные примеры работы с локальными пакетами
Пример 1: установка из wheel-файла с проверкой совместимости
Предположим, есть wheel-файл my_lib-2.1-cp39-cp39-manylinux_2_34_x86_64.whl. Установка:
pip install my_lib-2.1-cp39-cp39-manylinux_2_34_x86_64.whlProcessing ./my_lib-2.1-cp39-cp39-manylinux_2_34_x86_64.whl Installing collected packages: my-lib Successfully installed my-lib-2.1
При попытке установить тот же wheel на Python 3.8 возникнет ошибка совместимости. В таком случае используют опцию --force-reinstall или --ignore-requires-python (крайне не рекомендуется). Лучше найти правильный wheel или собрать его заново.
Пример 2: установка в виртуальное окружение с дополнительными индексами
Если основной пакет локальный, но некоторые его зависимости - из приватного PyPI-зеркала, можно совместить --find-links и --extra-index-url:
pip install \
--find-links=/path/to/local/wheels \
--extra-index-url=https://private-pypi.example.com/simple \
./my_packageLooking in links: /path/to/local/wheels Looking in indexes: https://private-pypi.example.com/simple, https://pypi.org/simple Processing ./my_package Collecting requests>=2.0 (from my-package) Found in /path/to/local/wheels/requests-2.31.0-py3-none-any.whl ... Successfully installed my-package-1.0 requests-2.31.0
Важно: порядок поиска - сначала локальные ссылки, потом внешние индексы. Если пакет есть и там и там, берётся первая подходящая версия.
Пример 3: полная изоляция с --no-index и кэшированием
Для установки на сервере без интернета все колёса заранее скачиваются и помещаются в архив. Команда установки:
pip install \
--no-index \
--find-links=/opt/offline-wheels \
--cache-dir=/tmp/pip-cache \
my_package==2.0Looking in links: /opt/offline-wheels Collecting my-package==2.0 Found in /opt/offline-wheels/my_package-2.0-py3-none-any.whl Collecting numpy>=1.20 (from my-package==2.0) Found in /opt/offline-wheels/numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ... Successfully installed my-package-2.0 numpy-1.24.3
Флаг --cache-dir позволяет указать временную папку для кэша, что ускоряет повторные установки.
Пример 4: установка пакета с игнорированием зависимостей и их ручной подстановкой
Иногда требуется установить локальный пакет без автоматического разрешения зависимостей, чтобы контролировать порядок или версии:
pip install --no-deps ./my_package
pip install requests==2.28.0
pip install packaging==24.0Processing ./my_package Installing collected packages: my_package Successfully installed my_package-1.0 Collecting requests==2.28.0 ... Successfully installed requests-2.28.0 packaging-24.0
Такой подход используется, когда одна из зависимостей имеет конфликтующие требования, и хочется задать точные версии. После ручной установки стоит запустить pip check, чтобы убедиться в отсутствии несовместимостей.
Пример 5: установка из локального репозитория Git с использованием подмодуля
Если пакет оформлен как git-подмодуль, его можно установить напрямую:
git clone --recurse-submodules https://example.com/main-project.git
cd main-project
git submodule update --init --recursive
pip install ./submodules/my-packageПри этом важно, что подмодуль содержит setup.py. Альтернативно, можно использовать синтаксис git+file:// из любого места:
pip install git+file:///абсолютный/путь/к/репозиторию@ветка#egg=my_package
--subdirectory=submodules/my-packageCollecting my-package from git+file:///абсолютный/путь/к/репозиторию@ветка#subdirectory=submodules/my-package Cloning... ... Successfully installed my-package-0.1
Обратите внимание на флаг --subdirectory, который указывает на папку с пакетом внутри репозитория. Эта опция доступна в pip 21.3+.