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

143

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

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

Мэтью Рэнкин
источник
1
Обратите внимание, что с pip 6.0 (2014-12-22) pip будет кешироваться по умолчанию. См. Pip.pypa.io/en/stable/reference/pip_install.html#caching для получения дополнительной информации.
Пи Делпорт,
Это не только сокращает время загрузки полосы пропускания, но и может устранить время, затрачиваемое на сканирование индекса PyPI для проверки доступных версий пакетов, а если вы кэшируете колеса, это может сократить время, затрачиваемое на создание колес для пакетов, которые их не предоставляют. . Это дает очень существенный прирост скорости.
Джонатан Хартли

Ответы:

126

Обновленный ответ 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. Это не устраняет необходимость доступа к сети, как указано в новостях pip , так что это не ответ для создания новых virtualenvsв самолете, но все же отлично.
Мэтью Рэнкин
источник
4
Возможно, лучше поместить его в .bashrc, потому что bash_profile выполняется только во время входа в систему. Это ваше дело, и в любом случае это хороший совет :)
Никита Хисматов
1
На Mac он загружается в начале любой оболочки.
saul.shanabrook
3
PIP_DOWNLOAD_CACHE имеет серьезные недостатки, и я бы не рекомендовал использовать его для таких вещей, как отправка пакетов на ваши машины развертывания. Он также по-прежнему полагается на доступность pypi.python.org. Отлично подходит для локального кэша разработки, но не подходит для более интенсивного использования.
slacy
1
@slacy Не могли бы вы прокомментировать, почему в нем серьезные недостатки? Если вы не хотите, чтобы PyPI был доступен, для этого нужен --no-index; кеш загрузки определенно ортогонален достижению PyPI или нет!
lvh 01
Ответ @lvh slacy ниже объясняет, почему кеш загрузки Pip ошибочен. Я также видел, как установка pip занимала больше времени с включенным кешем, как ни странно. pip-Accel и корзина кажутся лучшими вариантами.
qris
52

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

KZ
источник
+1 pip2pip отлично работает !! Я не очень люблю полагаться на возможность подключения к сети. Он терпит неудачу, когда вам это больше всего нужно.
MGP
это отлично работает, он отвечает на мой вопрос stackoverflow.com/questions/18052217/… , можете ли вы там ответить?
Ларри Кай
1
Возможно, это подразумевалось, но об этом стоит упомянуть явно: pip2tgzопределяет, если вы уже загрузили пакет в указанный каталог, поэтому, если вы запустите ту же строку установки или несколько строк установки, которые имеют перекрывающиеся зависимости, он загрузит каждый пакет только один раз.
clacke
32

Для более новых версий 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.

Flimm
источник
И если бы я хотел хранить их глобально для доступа других пользователей того же ПК? Как бы я это сделал? Я полагаю, что файл конфигурации должен быть помещен в / etc или что-то в этом роде.
Batandwa
@batandwa: Это может сработать. Если нет, то вы можете попробовать это: убедитесь , что все пользователи имеют pip.confс download_cacheустановкой , что указывает на тот же системный каталог.
Flimm 07
28

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

Slacy
источник
Габриэль - Он не загружается дважды, только один раз на первом шаге и затем устанавливается из локального кеша на втором. Что вы видите?
slacy
Если я дважды выполню первый шаг, он загрузится дважды, верно? По крайней мере, здесь произошло. Мне нужно знать, что первый шаг был выполнен для этого пакета хотя бы один раз, прежде чем запускать его, иначе он загрузит один и тот же файл дважды. Как я могу проверить, нужно ли мне его выполнить, или он был загружен раньше?
Габриэль Жордау,
Вероятно, вы просто хотите использовать pip2pi, как предлагает другой ответ. :)
slacy
это также загружает зависимости?
monkut
Я использую pip 18.1, а опции --no-install нет. Есть идеи, как обновить этот ответ?
paolof89
13

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

  • Флаги DEPRECATIONpip 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опцию.

Джейс Браунинг
источник
9

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

hdiogenes
источник
3

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

user1010997
источник
3

Вариант попроще 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

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

Бурхан Халид
источник
Ограничения (с официальной страницы): Корзина загружает только исходные дистрибутивы, она не может загружать пакеты, которые не размещены на PyPI, и игнорирует требования к версии (например, «нос> = 1.1.2»), всегда загружая последнюю версию.
hdiogenes
3

Для этого есть новое решение, называемое pip-Accel , прямая замена pipсо встроенным кешированием.

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

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

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

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

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

крис
источник
0

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

ластуман
источник