Обновите пакеты python из файла requirements.txt с помощью команды pip


115

Как мне обновить все мои пакеты python из файла requirements.txt с помощью команды pip?

попробовал с помощью команды ниже

$ pip install --upgrade -r requirements.txt

Поскольку пакеты python имеют суффикс с номером версии ( Django==1.5.1), они, похоже, не обновляются. Есть ли лучший подход, чем редактирование файла requirements.txt вручную?

РЕДАКТИРОВАТЬ

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

Но мы можем добиться этого с pip-toolsпомощью следующей команды.

$ pip-review --auto

это автоматически обновит все пакеты из файла requirements.txt (убедитесь, что вы установили его pip-toolsс помощью команды pip install).


7
Pip-tools отлично работает - обновлен синтаксис pip-compile -U requirements.txt.
erikreed 03

Ответы:


42

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

Пример:

lxml>=2.2.0

Это обновит lxml до любой версии новее 2.2.0.

lxml>=2.2.0,<2.3.0

Это позволит обновить lxml до последней версии между 2.2.0 и 2.3.0.


3
Я нашел полезным сделать следующее. 1. Удалил venv 2. Создал новый с таким же именем (способ очистки всех пакетов pip) 3. Заменил all == на> = в
файле

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt заменю все ==на>=
philshem

82

Я уже отвечал на этот вопрос здесь . Вот мое решение:

Поскольку не было простого способа обновления пакета за пакетом и обновления файла requirements.txt, я написал это pip-upgradeder, который также обновляет версии в вашем requirements.txtфайле. для выбранных пакетов (или всех пакетов).

Монтаж

pip install pip-upgrader

использование

Активируйте ваш virtualenv (важно, потому что он также установит новые версии обновленных пакетов в текущем virtualenv).

cd в каталог вашего проекта, затем запустите:

pip-upgrade

Расширенное использование

Если требования размещены в нестандартном месте, отправьте их в качестве аргументов:

pip-upgrade path/to/requirements.txt

Если вы уже знаете, какой пакет хотите обновить, просто отправьте их в качестве аргументов:

pip-upgrade -p django -p celery -p dateutil

Если вам нужно перейти на предварительную / пострелизную версию, добавьте --prerelease аргумент в свою команду.

Полное раскрытие: я написал этот пакет.


5
Большой! Удивительно, что такой функции нет непосредственно в pip
Jacopofar

5
Элегантно! Очень рад, что прокрутил вниз до этого: P
PulseJet

4
Я просто использовал это, и это лучший вариант со времен f-strings.
Pierre.Sassoulas

1
Отличный инструмент. Спасибо.
mszaro

Очень полезный инструмент! Я также нашел еще один пакет под названием pur, который также обновляет закрепленные версии
Gal

80

можешь попробовать:

pip install --upgrade --force-reinstall -r requirements.txt

Вы также можете игнорировать установленный пакет и установить новый:

pip install --ignore-installed -r requirements.txt

2
с этой опцией кажется, что переустановите ту же версию. Как упоминал Энди в ответе выше, пакеты привязаны к определенной версии.
abhiomkar

@abhiomkar, ты прав, я думал, ты хочешь переустановить ту же версию (возможно, чтобы добавить исправление обратного порта)
Freelancer

1
Вторая команда - это то, что я искал. Обратите внимание, что -Iи --ignore-installedявляются одними и теми же флагами, и, конечно же, недопустимо иметь ,там. Таким образом, во время установки не будет происходить возврат к предыдущей версии, а после завершения установки требований можно будет обновить установленные пакеты с помощью pip-review --auto.
AXO

4

Я предлагаю заморозить все ваши зависимости, чтобы иметь предсказуемые сборки .

При этом вы можете обновить сразу все зависимости следующим образом:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Сделав выше, проверить свой проект с новым набором пакетов и в конечном итоге совершить на requirements.txtфайл в хранилище.


3

Я просто должен был сделать то же самое ... использовал этот небольшой однострочник для выполнения работы:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

который:

  • packages=$(cat requirements.txt | sed 's/==.*//g') создает список текущих имен пакетов в файле requirements.txt (удаляя версию).
  • echo $packages | xargs pip3 install -U затем передает все пакеты в качестве аргументов в pip3 для обновления.
  • freeze=$(pip3 freeze); Получает все текущие версии пакета в формате, необходимом для файла requirements.txt.
  • for p in $(echo $packages) затем перебирает имена пакетов
    • echo $freeze | grep -E "^${p}==" >> requirements.new получает строку версии пакета из вывода pip freeze, которая соответствует пакету, и записывает в новый файл requirements.txt

Это дает дополнительное преимущество, заключающееся в сохранении порядка исходного файла requirements.txt. :)

Надеюсь это поможет!


2

Поскольку я не мог этого сделать с помощью bash, я написал модуль python для создания нового файла требований без версий и его использования:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Затем установите библиотеки из нового файла pip install -U -r requirements-prod-no-version.pip

Наконец, заморозьте версии в исходном файле pip freeze > requirements-prod.pip


2

Другое решение - использовать пакет требований к обновлению.

pip install upgrade-requirements

А затем запустите:

upgrade-requirements

Он обновит все пакеты, которые не являются последними версиями, а также создаст обновленный файл requirements.txt в конце.


0
  • 1) Чтобы обновить установленные файлы pip из reqs.txt, добавьте > = вместо ==, это скажет pip установить lib превышающей или равной запрашиваемой вами версии, здесь путем установки самой последней версии запрашиваемой библиотеки

    1.a) ** Мой ответ на тему ** Добавив py -m pip install -r reqs.txt к ежедневному перезапуску ... или что-то в этом роде, вы можете обновить установленные библиотеки. Подытожил Энди Идеально

    -Моя причина для входа в эту тему заключалась в том, чтобы найти информацию о том, как обновить базовый пип виртуального env (обычно для меня 10.0.03 ??)

в надежде решить проблему, для которой я смог найти одно из двух решений

А. создание Venv || Б. Установка необходимых библиотек

Благодаря Энди я удовлетворил потребность B

Добавив pip > = запрошенная версия в reqs.txt

при создании новой виртуальной среды || повторное создание предыдущего Venv

  1. py -m venv devenv

для установки нового dev env

  1. devenv\scripts\activate.bat

активировать dev env

  1. python -m pip install -r requirenments.txt

установить базовые библиотеки

урожайность

Сбор pip > = 20.0.2 (из -r requirenments.txt (строка 1)) Использование кешированного> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2- none-any.whl

Найдена существующая установка: pip 10.0.1

Удаление pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Извините за мозговой дамп, надеюсь, это кому-то поможет :)

🤳 Остин 👨‍🎤🚀🥊


0

Второй ответ наиболее полезен, но я хотел заблокировать одни пакеты, а другие были в последней версии (например, youtube-dl).

Пример requirements.txtбудет выглядеть так (~ означает совместимый):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Затем в терминале используйте команду pip install --upgrade -r requirements.txt

Это гарантирует, что Pillow останется на уровне 6.2.2, запросы будут обновлены до последней версии 2.22.x (если доступно), и будет установлена ​​последняя версия youtube-dl, если она еще не установлена.


0

Думаю, самое простое решение - создать файл requirements.txt с помощью:

pip freeze | sed 's/==/>=/' > requirements.txt

0

Вы можете использовать следующую команду в Linux и Mac:

cat requirements.txt | cut -f1 -d "=" | xargs pip install -U


-1

Если вы устанавливаете что-либо в своем проекте django и после установки вы хотите обновить свой файл требований, эта команда может обновить ваш файл require.txt pip freeze> requirements.txt

если ваш файл требований не существует в вашем проекте, вы можете использовать эту команду для создания нового файла require.txt pip freeze> requirements.txt


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

-10

Я редактирую файл requirements.txt, как показано ниже, и запускаю $ sh ./requirements.txt.

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;

3
Это идеальный пример антипаттерна. Что здесь не так: 1) requirements.txt - это файл .txt, но вы сделали его исполняемым 2). Существует простая команда pip install -r requirements.txt. Таким образом, вы можете использовать файл requirements.txt только для перечисления зависимостей вашего проекта. 3) Вы не используете версии пакетов. 4) Не распространенный шаблон, другие разработчики ничего не знают о том, как его использовать. 5) Трудно использовать с конвейерами CI / CD. Пожалуйста, не используйте этот пример
Фаннигурт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.