Как установить локальный кеш с помощью пипа?

Я устанавливаю много одинаковых пакетов в разных средах virtualenv. Есть ли способ загрузить пакет один раз, а затем установить pip из локального кеша?

Это снизит пропускную способность и время загрузки.

Ответ 1

Обновлен ответ 19-ноя-15

В соответствии с Документация по протоколу:

Начиная с v6.0, pip обеспечивает кеширование по умолчанию, которое работает так же, как и в веб-браузере. Хотя кеш включен по умолчанию и разработан правильно, по умолчанию вы можете отключить кеш и всегда обращаться к PyPI, используя параметр --no-cache-dir.

Поэтому обновленный ответ состоит в том, чтобы просто использовать pip со значениями по умолчанию, если вы хотите загрузить кеш файл.

Оригинальный ответ

Из новости о пике, версия 0.1.4:

Добавлена ​​поддержка переменной окружения $PIP_DOWNLOAD_CACHE, которая будет кэшировать загрузку пакетов, поэтому будущие установки не потребуют больших загрузок. Доступ к сети по-прежнему требуется, но при использовании этого можно избежать некоторых загрузок.

Чтобы воспользоваться этим, я добавил следующее к ~/.bash_profile:

export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache

или, если вы находитесь на Mac:

export PIP_DOWNLOAD_CACHE=$HOME/Library/Caches/pip-downloads

Примечания

  • Если обнаружена более новая версия пакета, она будет загружена и добавлена ​​в каталог PIP_DOWNLOAD_CACHE. Например, теперь у меня довольно много пакетов Django.
  • Это не устраняет необходимость в доступе к сети, как указано в новости о пике, так что это не ответ на создание нового virtualenvs на самолете, но он по-прежнему велик.

Ответ 2

По-моему, pip2pi является гораздо более элегантным и надежным решением для этой проблемы.

Из документов:

pip2pi создает репозиторий пакетов, совместимых с PyPI, из требований протокола

pip2pi позволяет создать собственный индекс PyPI с помощью двух простых команд:

  • Чтобы зеркалировать пакет и все его требования, используйте pip2tgz:

    $ cd /tmp/; mkdir package/
    $ pip2tgz packages/ httpie==0.2
    ...
    $ ls packages/
    Pygments-1.5.tar.gz
    httpie-0.2.0.tar.gz
    requests-0.14.0.tar.gz
    
  • Чтобы создать индекс пакета из предыдущего каталога:

    $ ls packages/
    bar-0.8.tar.gz
    baz-0.3.tar.gz
    foo-1.2.tar.gz
    $ dir2pi packages/
    $ find packages/
    /httpie-0.2.0.tar.gz
    /Pygments-1.5.tar.gz
    /requests-0.14.0.tar.gz
    /simple
    /simple/httpie
    /simple/httpie/httpie-0.2.0.tar.gz
    /simple/Pygments
    /simple/Pygments/Pygments-1.5.tar.gz
    /simple/requests
    /simple/requests/requests-0.14.0.tar.gz
    
  • Чтобы установить из индекса, который вы создали на шаге 2., вы можете просто использовать:

    pip install --index-url=file:///tmp/packages/simple/ httpie==0.2
    

Вы даже можете отразить свой собственный индекс на удаленном узле с помощью pip2pi.

Ответ 3

Для новых версий пива:

В версиях Newer версии теперь кешируется загрузка по умолчанию. См. Эту документацию:

https://pip.pypa.io/en/stable/reference/pip_install/#caching

Для старых версий версии:

Создайте файл конфигурации с именем ~/.pip/pip.conf и добавьте следующее содержимое:

[global]
download_cache = ~/.cache/pip

В OS X лучший путь для выбора будет ~/Library/Caches/pip, поскольку он следует за конвенцией, используемой другими программами OS X.

Ответ 4

PIP_DOWNLOAD_CACHE имеет некоторые серьезные проблемы. Самое главное, он кодирует имя хоста загрузки в кеш, поэтому использование зеркал становится невозможным.

Лучшим способом управления кешем загрузок пипов является разделение шага "загрузить пакет" с шага "установить пакет". Загруженные файлы обычно называются "sdist files" (исходные дистрибутивы), и я собираюсь хранить их в каталоге $SDIST_CACHE.

В результате два этапа:

pip install --no-install --use-mirrors -I --download=$SDIST_CACHE <package name>

Которая загрузит пакет и поместит его в каталог, на который указывает $SDIST_CACHE. Он не будет устанавливать пакет. И затем вы запустите:

pip install --find-links=file://$SDIST_CACHE --no-index --index-url=file:///dev/null <package name> 

Чтобы установить пакет в вашу виртуальную среду. В идеале $SDIST_CACHE будет осуществляться под вашим контролем источника. При развертывании на производство вы будете запускать только вторую команду pip для установки пакетов без их загрузки.

Ответ 5

Начиная с версии 6.0, pip теперь имеет собственное кэширование:

  • DEPRECATION pip install --download-cache и pip wheel --download-cache флаги командной строки устарели и функциональность удалена. Поскольку pip теперь автоматически настраивает и использует свой внутренний HTTP-кеш, который вытесняет --download-cache, существующие параметры были не функциональными, но все равно будут приняты до их удаления в pip v8.0. Для получения дополнительной информации см. https://pip.pypa.io/en/latest/reference/pip_install.html#caching

Дополнительная информация из выше ссылки:

Начиная с v6.0, pip обеспечивает кеширование по умолчанию, которое работает так же, как и в веб-браузере. Хотя кеш включен по умолчанию и разработан правильно, по умолчанию вы можете отключить кеш и всегда обращаться к PyPI, используя параметр --no-cache-dir.

Ответ 6

pip wheel - отличный вариант, который делает то, что вы хотите, с дополнительной функцией предварительной компиляции пакетов. Из официальных официальных документов:

Построить колеса для требования (и всех его зависимостей):

$ pip wheel --wheel-dir=/tmp/wheelhouse SomePackage

Теперь ваш каталог /tmp/wheelhouse содержит все ваши зависимости, предварительно скомпилированные, поэтому вы можете скопировать папку на другой сервер и установить все с помощью этой команды:

$ pip install --no-index --find-links=/tmp/wheelhouse SomePackage

Обратите внимание, что не все пакеты будут полностью переносимы между машинами. Некоторые пакеты будут созданы специально для версии Python, дистрибутива ОС и/или аппаратной архитектуры, которые вы используете. Это будет указано в имени файла, например -cp27-none-linux_x86_64 для CPython 2.7 на 64-разрядной Linux и т.д.

Ответ 7

Используя только pip (моя версия 1.2.1), вы также можете создать локальный репозиторий следующим образом:

if ! pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>; then
    pip install --download-directory="$PIP_SDIST_INDEX" <package>
    pip install --find-links="file://$PIP_SDIST_INDEX" --no-index <package>
fi

В первом вызове pip пакеты из файла требований просматриваются в локальном репозитории (только), а затем устанавливаются оттуда. Если это не удается, pip получает пакеты из своего обычного местоположения (например, PyPI) и загружает его в PIP_SDIST_INDEX (но ничего не устанавливает!). Первый вызов "повторен" для правильной установки пакета из локального индекса.

(--download-cache создает локальное имя файла, который является полным (экранированным) URL-адресом, а pip не может использовать его как индекс с --find-links. --download-cache будет использовать кешированный файл, если он найден. вариант со вторым вызовом pip, но поскольку индекс уже функционирует как своего рода кеш, это не обязательно приносит много. Это поможет, если ваш индекс опустеет, например.)

Ответ 8

Более простой вариант basket.

Учитывая имя пакета, он загрузит его и все зависимости в центральное место; без каких-либо недостатков кэша pip. Это отлично подходит для автономного использования.

Затем вы можете использовать этот каталог в качестве источника для pip:

pip install --no-index -f file:///path/to/basket package

Или easy_install:

easy_install -f ~/path/to/basket -H None package

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

Ответ 9

Появилось новое решение для pip-accel, замена для pip с встроенным кэшированием.

Программа pip-accel - это оболочка для pip, менеджера пакетов Python. Это ускоряет использование pip для инициализации виртуальных сред Python с учетом одного или нескольких файлов требований. Он делает это, комбинируя следующие два подхода:

  • Загрузка исходного дистрибутива кэшируется и используется для создания локального индекса архивов источников распространения.

  • Двоичные дистрибутивы используются для ускорения процесса установки зависимостей с бинарными компонентами (например, M2Crypto и LXML). Вместо повторной компиляции этих зависимостей для каждой виртуальной среды мы их компилируем один раз и кэшируем результат как бинарный дистрибутив *.tar.gz.

Paylogic использует pip-accel для быстрой и надежной инициализации виртуальных сред на своей ферме непрерывных интегральных ведомых, которые постоянно выполняют модульные тесты (это был один из первоначальных вариантов использования, для которых был разработан pip-accel). Мы также используем его на наших серверах сборки.

Мы видели около 10-кратного ускорения перехода от pip до pip-accel.