Як встановити з локального кеша з допомогою pip?


142

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

Це зменшить пропускну здатність завантаження та час.


1
Зауважте, що з pip 6.0 (2014-12-22) pip буде кешовано за замовчуванням. Докладні відомості див. У розділі pip.pypa.io/en/stable/reference/pip_install.html#caching .
Пі-Дельпорт

Це не просто скорочує пропускну здатність для завантаження, але також може усунути витрачений час на сканування індексу PyPI, щоб перевірити наявні версії пакетів, а якщо ви кешуєте колеса, це може усунути витрачені час на колесо для пакетів, які не надають їх . Це суттєво збільшує швидкість.
Джонатан Хартлі

Відповіді:


125

Оновлений відповідь 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 , тому це не є відповіддю для створення нового virtualenvsв літаку, але все-таки чудово.

4
Можливо, кращою ідеєю є введення його у .bashrc, оскільки bash_profile виконується лише під час входу. Це вирішувати вам, і все одно це хороша порада :)
Микита Хісматов

1
На macs він завантажується на початку будь-якої оболонки.
saul.shanabrook

3
PIP_DOWNLOAD_CACHE є серйозними помилками, і я б не рекомендував використовувати його для таких речей, як отримання пакетів на ваші машини розгортання. Він також все ще покладається на те, щоб pypi.python.org був доступний. Відмінно підходить для кешу локального розвитку, але не підходить для більш важкого використання.
шибениця

1
@slacy Не могли б ви прокоментувати, чому це серйозно хибно? Якщо ви не хочете, щоб PyPI був доступний, саме для цього --no-index; кеш завантаження, безумовно, є ортогональним до досягнення PyPI чи ні!
lvh

Відповідь @lvh slacy нижче пояснює, чому кеш завантаження Піпа є помилковим. Я також бачив, як встановлення піп триває довше, якщо кеш увімкнено, химерно. Піп-аксель та кошик, схоже, є кращими варіантами.
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.


+1 pip2pip чудово працює !! Мені не подобається настільки покладатися на мережеве підключення. Він виходить з ладу, коли вам це найбільше потрібно.
MGP

це чудово працює, він відповідає на моє запитання stackoverflow.com/questions/18052217/… , чи можна відповісти і там?
Ларрі Кай

1
Можливо, це малося на увазі, але варто чітко згадати: pip2tgzвиявляє, якщо ви вже завантажили пакунок у призначений каталог, тому якщо ви запустите ту саму лінію встановлення або кілька ліній встановлення, які мають перекриваються залежності, він завантажить кожен пакет лише один раз.
клак

32

Для новіших версій Pip:

Новіші версії Pip тепер завантажують кеш за замовчуванням. Дивіться цю документацію:

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

Для старих версій Pip:

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

[global]
download_cache = ~/.cache/pip

Для ОС X краще вибрати шлях, ~/Library/Caches/pipоскільки він дотримується конвенції, яку використовують інші програми OS X.


І якщо я хотів би зберігати їх у всьому світі для доступу інших користувачів того ж ПК? Як би я це зробив? Я думаю, що конфігураційний файл повинен бути розміщений в / etc або щось інше.
Batandwa

@batandwa: Це може спрацювати. Якщо немає, то ви можете спробувати це: переконайтеся , що всі користувачі мають pip.confз download_cacheустановкою , що вказує на той же системний каталог.
Flimm

28

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, щоб встановити пакети, не завантажуючи їх.


Габріель - це не завантажується двічі, лише один раз на першому кроці, а потім встановлюється з локального кешу на другому. Що ти бачиш?
шило

Якщо я запускаю перший крок двічі, він завантажить його двічі, правда? Принаймні, це сталося тут. Мені потрібно знати, що перший крок для цього пакету був виконаний принаймні один раз перед його виконанням, інакше він завантажить той самий файл двічі. Як я можу перевірити, чи потрібно мені його виконати, або це було завантажено раніше?
Габріель Йордао

Напевно, ви просто хочете використовувати pip2pi, як підказує інша відповідь. :)
ковзання

це також завантажує залежності?
monkut

Я використовую pip 18.1 і варіант --no-install не присутній. Будь-яка ідея, як оновити цю відповідь?
paolof89

13

Починаючи з версії 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#caching

Більше інформації за вищенаведеним посиланням :

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


9

Піп-колесо - це відмінний варіант, який робить те, що ви хочете, за допомогою додаткової функції попереднього складання пакетів. З офіційних документів :

Створіть колеса для вимоги (та всіх її залежностей):

$ 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

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


3

Існує нове рішення для цього під назвою pip-accel , заміною для pipвипадання для вбудованого кешування.

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

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

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

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

Ми спостерігали приблизно 10-кратну швидкість від переходу pipдо pip-accel.


2

Більш простий варіант basket.

Давши назву пакета, він завантажить його та всі залежності до центрального місця; без жодних недоліків кеш-пам'яті. Це чудово для офлайн-використання.

Потім ви можете використовувати цей каталог як джерело для 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.