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


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

Can pip быть произведена до удалить пакеты, которые не отображаются в файле требований, а также установка тех, которые появляются? Есть ли стандартный метод?

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

обновление: я предложил его в качестве новой функции на https://github.com/pypa/pip/issues/716

6 53

6 ответов:

короткий ответ: Нет, вы не можете сделать это с Pip.

это должно удалить что-нибудь не в требованиях.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

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

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

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

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

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

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

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

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

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


настройка рабочего пространства 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

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

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

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

pip uninstall -r requirements.txt