Как установить из локального кэша с помощью 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
Заметки
- Если обнаружена более новая версия пакета, он будет загружен и добавлен в
PIP_DOWNLOAD_CACHE
каталог. Например, у меня сейчас есть несколько пакетов Django. - Это не устраняет необходимость в доступе к сети, как указано в новостях в пипсах, поэтому это не решение для создания новых
virtualenvs
на самолете, но это все еще здорово.
По моему мнению, pip2pi
является гораздо более элегантным и надежным решением этой проблемы.
Из документов:
pip2pi создает PyPI-совместимый репозиторий пакетов из требований pip
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
,
Для более новых версий 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
- это путь к каталогу, в который должны быть загружены пакеты.