Я устанавливаю много одних и тех же пакетов в разных виртуальных средах. Есть ли способ, которым я могу загрузить пакет один раз, а затем установить pip из локального кеша?
Это уменьшит полосу пропускания и время загрузки.
Я устанавливаю много одних и тех же пакетов в разных виртуальных средах. Есть ли способ, которым я могу загрузить пакет один раз, а затем установить pip из локального кеша?
Это уменьшит полосу пропускания и время загрузки.
Ответы:
Согласно документации 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
.
pip2tgz
определяет, если вы уже загрузили пакет в указанный каталог, поэтому, если вы запустите ту же строку установки или несколько строк установки, которые имеют перекрывающиеся зависимости, он загрузит каждый пакет только один раз.
Новые версии Pip теперь по умолчанию кешируют загрузки. См. Эту документацию:
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.conf
с download_cache
установкой , что указывает на тот же системный каталог.
PIP_DOWNLOAD_CACHE имеет серьезные проблемы. Что наиболее важно, он кодирует имя хоста загрузки в кеш, поэтому использование зеркал становится невозможным.
Лучший способ управлять кешем загрузок pip - отделить шаг «загрузить пакет» от шага «установить пакет». Загруженные файлы обычно называются «файлами 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
теперь есть собственное кеширование:
- Флаги 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 cache. Это отлично подходит для автономного использования.
Затем вы можете использовать этот каталог в качестве источника для 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
.