Я встановлюю багато однакових пакетів у різних середовищах virtualenv . Чи є спосіб, коли я можу завантажити пакет один раз, а потім встановити pip з локального кешу?
Це зменшить пропускну здатність завантаження та час.
Я встановлюю багато однакових пакетів у різних середовищах virtualenv . Чи є спосіб, коли я можу завантажити пакет один раз, а потім встановити pip з локального кешу?
Це зменшить пропускну здатність завантаження та час.
Відповіді:
Відповідно до документації 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
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
Для ОС X краще вибрати шлях, ~/Library/Caches/pip
оскільки він дотримується конвенції, яку використовують інші програми OS X.
pip.conf
з download_cache
установкою , що вказує на той же системний каталог.
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#caching
Більше інформації за вищенаведеним посиланням :
Починаючи з v6.0, pip забезпечує кеш за замовчуванням, який функціонує аналогічно веб-браузеру. Хоча кеш увімкнено за замовчуванням і призначений робити правильно, за замовчуванням ви можете вимкнути кеш і завжди отримати доступ до PyPI, використовуючи цю
--no-cache-dir
опцію.
Піп-колесо - це відмінний варіант, який робить те, що ви хочете, за допомогою додаткової функції попереднього складання пакетів. З офіційних документів :
Створіть колеса для вимоги (та всіх її залежностей):
$ 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-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
Ви також можете використовувати його для оновлення кошика, коли ви знаходитесь в Інтернеті.