У меня есть файл требований к пипу, который меняется во время разработки.
Можно pip
ли удалить пакеты, которые не указаны в файле требований, а также установить те, которые появляются? Есть стандартный метод?
Это позволит файлу требований к pip быть каноническим списком пакетов - подход «если и только если».
Обновление : я предложил это как новую функцию на https://github.com/pypa/pip/issues/716
Ответы:
Короткий ответ - нет, вы не можете сделать это с помощью pip.
источник
pip uninstall -r requirements.txt
-y
в команду @Ommit, чтобы не нажимать Y и вводить много раз. Учитесь на моих ошибках.pip uninstall -r requirements.txt
удалит только версии из вашего файла requirements.txt. Если вы удалите,boto3==1.10.0
например,pip freeze
покажетboto3==1.0.1
, устанавливали ли вы его (или любую старую версию) ранее.Это должно удалить все, чего нет в файле requirements.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
Тогда очевидно:
Обновление за 2016 год: вы, вероятно, действительно не хотите использовать описанный выше подход. Проверьте,
pip-tools
иpip-sync
какой из них выполняет то, что вы, вероятно, хотите сделать, гораздо более надежным способом.https://github.com/nvie/pip-tools
Обновление за май 2016 г .:
Теперь вы также можете использовать
pip uninstall -r requirements.txt
, однако это дает в основном обратное - он удаляет все вrequirements.txt
Обновление за май 2019 г .:
Проверьте pipenv . Многое произошло в мире управления пакетами, поэтому вопросы такого рода немного устарели. На самом деле я все еще с удовольствием использую pip-tools.
источник
project.config
файл для Django на Elastic Beanstalk:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Теперь я могу откатывать пакеты pip без перестройки среды, просто используя комментарии вrequirements.txt
. Это экономит мне реальное время простоя. Спасибо!pip freeze
делает комментарии, но когда-нибудь они могут добавить это в API, и если они это сделают, это будет действительным. Если они этого не сделают, то вышеперечисленное не работает. Строка позволяет использовать stdin из предыдущей команды, в этом случае черточка сообщает grep о необходимости сравнить содержимоеpip freeze
pip freeze
Это не особенность
pip
, нет. Если вам действительно нужна такая вещь, вы можете написать сценарий для сравнения результатовpip freeze
с вашимrequirements.txt
, но это, вероятно, будет больше хлопот, чем оно того стоит.Используя
virtualenv
, проще и надежнее просто создать чистую среду и (пере) установить изrequirements.txt
, например:источник
requirements.txt
), зачем его снова устанавливать?Теперь вы можете передать
-r requirements.txt
аргументpip uninstall
.По крайней мере, с
pip
8.1.2pip help uninstall
показывает:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
источник
Это старый вопрос (но хороший), и с тех пор, как он был задан, все существенно изменилось.
В
pip-sync
другом ответе есть косвенная ссылка , но она заслуживает отдельного ответа, потому что она решает именно проблему OP.pip-sync принимает
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
источник
Предложение Стивена - хорошая идея, но, к сожалению, она не сработает, если вы включите в свой файл только прямые требования, что мне кажется более понятным.
Все зависимости будут удалены, в том числе даже
distribute
, сломавшисьpip
сам.Поддержание чистого файла требований при отслеживании версий в виртуальной среде
Вот как я пытаюсь отслеживать версии моей виртуальной среды. Я стараюсь поддерживать минимум
requirements.txt
, включая только прямые требования, и даже не упоминаю об ограничениях версий, где я не уверен.Но, кроме того, я сохраняю и включаю в отслеживание версий (скажем, git) фактический статус моего virtualenv в
venv.pip
файле.Вот пример рабочего процесса:
настроить рабочее пространство virtualenv с отслеживанием версий:
инициализировать систему отслеживания версий:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
установить пакет с зависимостями, включить его в файл требований:
Теперь начните создавать свое приложение, затем выполните фиксацию и начните новую ветку:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
установить дополнительный пакет:
... поиграйте с ним, а затем вернитесь к более ранней версии
vim manage.py git commit -am "Playing with flask-script" git checkout master
Теперь удалите посторонние пакеты:
Полагаю, этот процесс можно автоматизировать с помощью git-хуков, но не будем отходить от темы.
Конечно, тогда имеет смысл использовать какую-то систему кеширования пакетов или локальный репозиторий, например pip2pi.
источник
Копирование @ stephen-j-fuhry вот эквивалент PowerShell, который я использую:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
источник
Хотя это не дает прямого ответа на вопрос, лучшей альтернативой
requirements.txt
сейчас является использованиеPipfile
. Это работает аналогично RubyGemfile
. В настоящее время вам необходимо использовать этотpipenv
инструмент, но, надеюсь, в конечном итоге он будет включен вpip
. Это даетpipenv clean
команду, которая делает то, что вы хотите.(Обратите внимание, что вы можете импортировать существующий
requirements.txt
с помощьюpipenv install -r requirements.txt
. После этого у вас должен быть значок,Pipfile
и егоrequirements.txt
можно удалить.)источник
Теперь можно использовать:
источник