Я устанавливаю много одинаковых пакетов в разных средах virtualenv. Есть ли способ загрузить пакет один раз, а затем установить pip из локального кеша?
Это снизит пропускную способность и время загрузки.
Я устанавливаю много одинаковых пакетов в разных средах virtualenv. Есть ли способ загрузить пакет один раз, а затем установить 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
PIP_DOWNLOAD_CACHE
. Например, теперь у меня довольно много пакетов Django.virtualenvs
на самолете, но он по-прежнему велик.По-моему, 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
.
В версиях 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.
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 для установки пакетов без их загрузки.
Начиная с версии 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
.
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, но поскольку индекс уже функционирует как своего рода кеш, это не обязательно приносит много. Это поможет, если ваш индекс опустеет, например.)
Более простой вариант basket
.
Учитывая имя пакета, он загрузит его и все зависимости в центральное место; без каких-либо недостатков кэша pip. Это отлично подходит для автономного использования.
Затем вы можете использовать этот каталог в качестве источника для pip
:
pip install --no-index -f file:///path/to/basket package
Или easy_install
:
easy_install -f ~/path/to/basket -H None package
Вы также можете использовать его для обновления корзины всякий раз, когда вы в сети.
Появилось новое решение для pip-accel, замена для pip
с встроенным кэшированием.
Программа pip-accel - это оболочка для pip, менеджера пакетов Python. Это ускоряет использование pip для инициализации виртуальных сред Python с учетом одного или нескольких файлов требований. Он делает это, комбинируя следующие два подхода:
Загрузка исходного дистрибутива кэшируется и используется для создания локального индекса архивов источников распространения.
Двоичные дистрибутивы используются для ускорения процесса установки зависимостей с бинарными компонентами (например, M2Crypto и LXML). Вместо повторной компиляции этих зависимостей для каждой виртуальной среды мы их компилируем один раз и кэшируем результат как бинарный дистрибутив *.tar.gz.
Paylogic использует pip-accel для быстрой и надежной инициализации виртуальных сред на своей ферме непрерывных интегральных ведомых, которые постоянно выполняют модульные тесты (это был один из первоначальных вариантов использования, для которых был разработан pip-accel). Мы также используем его на наших серверах сборки.
Мы видели около 10-кратного ускорения перехода от pip
до pip-accel
.