Как мне установить из локального кэша с pip? - PullRequest
134 голосов
/ 26 января 2011

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

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

Ответы [ 10 ]

122 голосов
/ 26 января 2011

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

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

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

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

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

Из новостей 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. Это не устраняет необходимость в доступе к сети, как указано в pip news , так что это не ответ на вопрос о создании нового virtualenvs на самолете, но это все равно здорово.
50 голосов
/ 21 сентября 2012

На мой взгляд, 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.

31 голосов
/ 11 апреля 2013

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

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

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

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

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

[global]
download_cache = ~/.cache/pip

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

28 голосов
/ 27 августа 2012

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, чтобы установить пакеты без их загрузки.

13 голосов
/ 29 декабря 2014

Начиная с версии 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.

8 голосов
/ 30 декабря 2014

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

3 голосов
/ 10 декабря 2012

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

2 голосов
/ 02 октября 2014

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

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

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

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

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

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

2 голосов
/ 22 марта 2014

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

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

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

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

или easy_install:

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

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

0 голосов
/ 11 июня 2018

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

...