Tell pip установить зависимости пакетов, перечисленных в файле требований
Разработка веб-приложения Django, у меня есть список пакетов, которые мне нужно установить в virtualenv. Скажи:
Django==1.3.1
--extra-index-url=http://dist.pinaxproject.com/dev/
Pinax==0.9b1.dev10
git+git://github.com/pinax/[email protected]90
# and other packages
Сначала я устанавливал их вручную, один за другим, по разработке. Это установило необходимые зависимости, и я, наконец, использовал pip freeze
перед развертыванием приложения.
Проблема в том, что при обновлении некоторых пакетов некоторые зависимости больше не используются и не требуются, но они сохраняются в списке pip freeze
.
Теперь я хотел бы создать новый virtualenv следующим образом:
- поместите необходимые пакеты (без их зависимостей) в файл требований,
например manual-requirements.txt
- установить их со своими зависимостями
pip install -r manual-requirement.txt
(← проблема, это не устанавливает зависимости)
- заморозить полный virtualenv
pip freeze -r manual-requirements.txt > full-requirements.txt
и развертывания.
Любой способ сделать это без ручной переустановки пакетов в новом virtualenv для получения их зависимостей? Это было бы подвержено ошибкам, и я хотел бы автоматизировать процесс очистки виртуальных серверов от ненужных старых зависимостей.
edit:, на самом деле, pip устанавливает зависимости, явно не перечисленные в файле требований, даже если документация сообщает нам, что такие файлы плоские. Я ошибался в отношении того, какие зависимости я ожидал установить. Я дам этот вопрос кому-нибудь, кто сомневается в том, что pip не устанавливает все зависимости.
Ответы
Ответ 1
Учитывая ваш комментарий к вопросу (где вы говорите, что выполнение установки для одного пакета работает так, как ожидалось), я бы предложил выполнить цикл над вашим файлом требований. В bash:
#!/bin/sh
while read p; do
pip install $p
done < requirements.pip
НТН!
Ответ 2
просто, используйте:
pip install -r requirement.txt
он может установить все перечисленные в файле требований.
Ответ 3
Любой способ сделать это без ручной переустановки пакетов в новом virtualenv для получения их зависимостей? Это было бы подвержено ошибкам, и я хотел бы автоматизировать процесс очистки виртуальных серверов от ненужных старых зависимостей.
Что для пакета пип-инструментов (от https://github.com/nvie/pip-tools):
Установка
$ pip install --upgrade pip # pip-tools needs pip==6.1 or higher (!)
$ pip install pip-tools
Пример использования для pip-compile
Предположим, что у вас есть проект Flask и вы хотите его вывести для производства. Напишите в файл следующую строку:
# requirements.in
Flask
Теперь запустите команду pip-compile requirements.in:
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
# pip-compile requirements.in
#
flask==0.10.1
itsdangerous==0.24 # via flask
jinja2==2.7.3 # via flask
markupsafe==0.23 # via jinja2
werkzeug==0.10.4 # via flask
И он создаст ваш requirements.txt
, при этом все зависимостей Flask (и все базовые зависимости) будут закреплены. Поместите этот файл под контроль версий и периодически запустите pip-compile
, чтобы обновить пакеты.
Пример использования для pip-sync
Теперь, когда у вас есть requirements.txt
, вы можете использовать pip-sync
для обновления своего виртуального env, чтобы точно отразить то, что там. Примечание. Это приведет к установке/обновлению/удалению всего необходимого, чтобы соответствовать содержимому requirements.txt
.
$ pip-sync
Uninstalling flake8-2.4.1:
Successfully uninstalled flake8-2.4.1
Collecting click==4.1
Downloading click-4.1-py2.py3-none-any.whl (62kB)
100% |████████████████████████████████| 65kB 1.8MB/s
Found existing installation: click 4.0
Uninstalling click-4.0:
Successfully uninstalled click-4.0
Successfully installed click-4.1
Ответ 4
Расширяя ответ петра, если вам также нужен способ выяснить, что поместить в requirements.in
, вы можете сначала использовать pip-chill
, чтобы найти минимальный набор необходимых пакетов, которые у вас есть. Комбинируя эти инструменты, вы можете показать причину зависимости, по которой установлен каждый пакет. Полный цикл выглядит следующим образом:
- Создать виртуальную среду:
$ python3 -m venv venv
- Активируйте его:
$ . venv/bin/activate
- Установите новейшую версию pip, pip-tools и pip-chill:
(venv)$ pip install --upgrade pip
(venv)$ pip install pip-tools pip-chill
- Создайте свой проект, установите больше пакетов pip и т.д., Пока не захотите сохранить...
- Извлечь минимальный набор пакетов (т.е. верхнего уровня без зависимостей):
(venv)$ pip-chill --no-version > requirements.in
- Скомпилируйте список всех необходимых пакетов (с указанием причин зависимости):
(venv)$ pip-compile requirements.in
- Убедитесь, что текущая установка синхронизирована со списком:
(venv)$ pip-sync