Как я могу использовать файл требований к файлам для удаления, а также установить пакеты?

У меня есть файл требований к приложению, который изменяется во время разработки.

Может ли pip сделать удалить пакеты, которые не отображаются в файле требований, а также установить те, которые появляются? Существует ли стандартный метод?

Это позволит файлу требований к пикам быть каноническим списком пакетов - подход "если и только если".

Обновить. Я предложил новую функцию https://github.com/pypa/pip/issues/716

Ответ 1

Короткий ответ - нет, вы не можете сделать это с помощью pip.

Ответ 2

Это должно удалить все, что не в файле require.txt:

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y

Хотя это не будет работать правильно с пакетами, установленными с -e, то есть из репозитория git или подобного. Чтобы пропустить их, просто отфильтруйте пакеты, начиная с флага -e:

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y

Тогда, очевидно:

pip install -r requirements.txt

Обновление за 2016 год: вы, вероятно, действительно не хотите использовать вышеописанный подход. Проверьте pip-tools и pip-sync которые выполняют то, что вы, вероятно, хотите сделать гораздо более надежным способом.

https://github.com/nvie/pip-tools

Обновление за май 2016 года:

Теперь Вы можете также использовать pip uninstall -r requirements.txt, однако это в основном выполняет обратное - она удаляет все в requirements.txt

Обновление за май 2019 года:

Проверьте pipenv. Многое произошло в мире управления пакетами, что делает этот вопрос немного устаревшим.

Ответ 3

Это не особенность pip, no. Если вы действительно этого хотите, вы можете написать script для сравнения вывода pip freeze с вашим requirements.txt, но, скорее всего, это будет больше хлопот, чем того стоит.

Используя virtualenv, проще и надежнее просто создать чистую среду и (повторно) установить из requirements.txt, например:

deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt

Ответ 4

Теперь вы можете передать аргумент -r requirements.txt для pip uninstall.

pip uninstall -r requirements.txt -y

По крайней мере, pip с pip 8.1.2, pip help uninstall показывает:

...
Uninstall Options:
  -r, --requirement <file>    Uninstall all the packages listed in the given requirements file.  This option can be
                              used multiple times.
...

Ответ 5

Предложение Стивена - хорошая идея, но, к сожалению, это не работает если вы включаете в свой файл только прямые требования, которые звучат очиститель для меня.

Все зависимости будут удалены, включая даже distribute, разбив сам pip.

Поддержание чистого файла требований при отслеживании версий виртуальной среды

Вот как я пытаюсь изменить версию моей виртуальной среды. Я стараюсь поддерживать минимальный requirements.txt, включая только прямые требования, и даже не упоминать ограничения версий, где Я не уверен.

Но кроме того, я сохраняю и включаю в отслеживание версий (скажем git), фактическое состояние моего virtualenv в файле venv.pip.

Вот пример рабочего процесса:


настроить рабочее пространство virtualenv с отслеживанием версий:

mkdir /tmp/pip_uninstalling
cd /tmp/pip_uninstalling
virtualenv venv
. venv/bin/activate

инициализировать систему отслеживания версий:

git init
echo venv > .gitignore
pip freeze > venv.pip
git add .gitignore venv.pip
git commit -m "Python project with venv"

установите пакет с зависимостями, включите его в файл требований:

echo flask > requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

Теперь приступите к созданию своего приложения, затем выполните и запустите новую ветку:

vim myapp.py
git commit -am "Simple flask application"
git checkout -b "experiments"

установите дополнительный пакет:

echo flask-script >> requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

... играйте с ним, а затем вернитесь к более ранней версии

vim manage.py
git commit -am "Playing with flask-script"
git checkout master

Теперь удалите посторонние пакеты:

pip freeze | grep -v -f venv.pip | xargs pip uninstall -y

Я полагаю, что процесс может быть автоматизирован с помощью git перехватчиков, но не отходить от темы.

Конечно, имеет смысл использовать некоторую систему кэширования пакетов или локальный репозиторий, например pip2pi

Ответ 6

Piggybacking off @stephen-j-fuhry здесь эквивалент powershell, который я использую:

pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }

Ответ 7

Хотя это и не прямо ответить на вопрос, лучшая альтернатива requirements.txt теперь с помощью Pipfile. Это работает аналогично Ruby Gemfile. В настоящее время вам необходимо использовать инструмент pipenv, но, надеюсь, в конечном итоге он будет включен в pip. Это обеспечивает команду pipenv clean которая делает то, что вы хотите.

(Обратите внимание, что вы можете импортировать существующий requirements.txt с pipenv install -r requirements.txt. После этого вы должны иметь Pipfile и requirements.txt могут быть удалены.)

Ответ 8

Это старый вопрос (но хороший), и с тех пор, как его спросили, все существенно изменилось.

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

пип-синхронизация занимает requirements.txt файл в качестве входных данных, и "до истины" текущая среда Python, так что он соответствует именно то, что в этом requirements.txt. Это включает в себя удаление любых пакетов, которые присутствуют в вашем окр но отсутствует requirements.txt.

Пример: Предположим, что мы хотим, чтобы наш окр содержать (только) 3 библиотеки: libA, libB и libC, как так:

> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2

Но наш env в настоящее время содержит libC и libD:

> pip freeze
libC==1.2
libD==1.3

Запуск pip-sync приведет к этому, который был нашим желаемым конечным состоянием:

> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2

Ответ 9

Теперь можно использовать:

pip uninstall -r requirements.txt