Ответ 1
Короткий ответ - нет, вы не можете сделать это с помощью pip.
У меня есть файл требований к приложению, который изменяется во время разработки.
Может ли pip
сделать удалить пакеты, которые не отображаются в файле требований, а также установить те, которые появляются? Существует ли стандартный метод?
Это позволит файлу требований к пикам быть каноническим списком пакетов - подход "если и только если".
Обновить. Я предложил новую функцию https://github.com/pypa/pip/issues/716
Короткий ответ - нет, вы не можете сделать это с помощью pip.
Это должно удалить все, что не в файле 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. Многое произошло в мире управления пакетами, что делает этот вопрос немного устаревшим.
Это не особенность 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
Теперь вы можете передать аргумент -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.
...
Предложение Стивена - хорошая идея, но, к сожалению, это не работает если вы включаете в свой файл только прямые требования, которые звучат очиститель для меня.
Все зависимости будут удалены,
включая даже 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
Piggybacking off @stephen-j-fuhry здесь эквивалент powershell, который я использую:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
Хотя это и не прямо ответить на вопрос, лучшая альтернатива requirements.txt
теперь с помощью Pipfile
. Это работает аналогично Ruby Gemfile
. В настоящее время вам необходимо использовать инструмент pipenv
, но, надеюсь, в конечном итоге он будет включен в pip
. Это обеспечивает команду pipenv clean
которая делает то, что вы хотите.
(Обратите внимание, что вы можете импортировать существующий requirements.txt
с pipenv install -r requirements.txt
. После этого вы должны иметь Pipfile
и requirements.txt
могут быть удалены.)
Это старый вопрос (но хороший), и с тех пор, как его спросили, все существенно изменилось.
В другом ответе есть косвенная ссылка на 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
Теперь можно использовать:
pip uninstall -r requirements.txt