Установка Python пакетов из локального репозитория

Раздел: 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.whl

Python 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_package

Python 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_package

Update lib python (обновление библиотек python)

Проблема:

Зависимости могут конфликтовать с уже установленными версиями. Используют pip check после установки. Если конфликт возник, создают чистое виртуальное окружение. Другая проблема - если в requirements.txt указаны пакеты из внешних источников, а сеть недоступна. Тогда скачивают все зависимости заранее (pip download) и используют --find-links.

Как установить пакет из папки с предварительно собранными wheel-файлами?

Когда все зависимости и сам пакет собраны в виде .whl-файлов и помещены в одну локальную папку, удобно использовать --find-links вместе с --no-index:

pip install --no-index --find-links=/путь/к/папке/с/колесами my_package

Python 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 будет ругаться на пропущенные пакеты.

- Python pip windows (установка pip на windows)
- Apt get python (установка python через apt-get)
- Windows package python (установка пакетов python на windows)

Расширенные примеры работы с локальными пакетами

Пример 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.whl
Processing ./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_package
Looking 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.0
Looking 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.0
Processing ./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-package
Collecting my-package from git+file:///абсолютный/путь/к/репозиторию@ветка#subdirectory=submodules/my-package
  Cloning...
...
Successfully installed my-package-0.1

Обратите внимание на флаг --subdirectory, который указывает на папку с пакетом внутри репозитория. Эта опция доступна в pip 21.3+.

Установка локального пакета через pip - comments

En
Python pip install local package (python)