Как установить из локального кэша с помощью pip?

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

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

11 ответов

Решение

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

Согласно документации Pip:

Начиная с 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

Заметки

  1. Если обнаружена более новая версия пакета, он будет загружен и добавлен в PIP_DOWNLOAD_CACHE каталог. Например, у меня сейчас есть несколько пакетов Django.
  2. Это не устраняет необходимость в доступе к сети, как указано в новостях в пипсах, поэтому это не решение для создания новых virtualenvs на самолете, но это все еще здорово.

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

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

pip2pi создает PyPI-совместимый репозиторий пакетов из требований pip

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

  1. Чтобы отразить пакет и все его требования, используйте 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
    
  2. Чтобы создать индекс пакета из предыдущего каталога:

    $ 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
    
  3. Чтобы установить из индекса, созданного на шаге 2., вы можете просто использовать:

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

Вы даже можете зеркалировать свой собственный индекс на удаленный хост с pip2pi,

Для более новых версий Pip:

Более новые версии Pip теперь кэшируют загрузки по умолчанию. Смотрите эту документацию:

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

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

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

[global]
download_cache = ~/.cache/pip

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

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

Лучший способ управлять кэшем загрузок в пипсах - это отделить этап "скачать пакет" от шага "установить пакет". Загруженные файлы обычно называются "файлами sdist" (исходные коды), и я собираюсь хранить их в каталоге $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, чтобы установить пакеты без их загрузки.

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

  • неодобрение 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

Больше информации по ссылке выше:

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

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 и т. д.

Используя только 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, но так как индекс уже функционирует как своего рода кеш, он не обязательно приносит много. Например, было бы полезно, если ваш индекс опустошен.)

Существует новое решение для этого, называемое pip-accel, замена для pip со встроенным кешированием

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

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

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

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

Мы видели примерно 10-кратное ускорение от переключения с pip в pip-accel,

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

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

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

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

Или же easy_install:

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

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

Я обнаружил, что для загрузки пакетов и последующей установки из них полезно следующее:

      pip download -d "$SOME_DIRECTORY" some-package

Затем установить:

      pip install --no-index --no-cache-dir --find-links="$SOME_DIRECTORY"

Где $SOME_DIRECTORY - это путь к каталогу, в который должны быть загружены пакеты.

Я думаю, что пакет "pip-accel" должен быть хорошим выбором.

Другие вопросы по тегам