Actualice los paquetes de python desde requirements.txt usando el comando pip


113

¿Cómo actualizo todos mis paquetes de Python desde el archivo requirements.txt usando el comando pip?

intentado con el siguiente comando

$ pip install --upgrade -r requirements.txt

Dado que los paquetes de Python tienen el sufijo del número de versión ( Django==1.5.1), no parecen actualizarse. ¿Hay algún método mejor que editar manualmente el archivo requirements.txt?

EDITAR

Como Andy mencionó en su respuesta, los paquetes están anclados a una versión específica, por lo que no es posible actualizar los paquetes a través del comando pip.

Pero podemos lograr esto pip-toolsusando el siguiente comando.

$ pip-review --auto

esto actualizará automáticamente todos los paquetes de requirements.txt (asegúrese de instalar pip-toolsusando el comando pip install).


7
Pip-tools funciona muy bien, la sintaxis actualizada sí lo es pip-compile -U requirements.txt.
erikreed

Respuestas:


40

No. Su archivo de requisitos se ha anclado a versiones específicas. Si sus requisitos están configurados para esa versión, no debería intentar actualizar más allá de esas versiones. Si necesita actualizar, debe cambiar a versiones no ancladas en su archivo de requisitos.

Ejemplo:

lxml>=2.2.0

Esto actualizaría lxml a cualquier versión posterior a la 2.2.0

lxml>=2.2.0,<2.3.0

Esto actualizaría lxml a la versión más reciente entre 2.2.0 y 2.3.0.


2
Encontré útil hacer lo siguiente. 1. Venv eliminado 2. Creó uno nuevo con el mismo nombre (la forma de limpiar todos los paquetes de pip) 3. Reemplace todo == por> = en requirements.txt 4. pip install -r requirements.txt 4.
zhukovgreen

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt reemplazará a todos ==con>=
philshem

80

puedes probar:

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

También puede ignorar el paquete instalado e instalar el nuevo:

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

2
con esa opción parece reinstalar la misma versión. Como Andy mencionó en la respuesta anterior, los paquetes están anclados a una versión específica.
abhiomkar

@abhiomkar tienes razón, pensé que querías volver a instalar la misma versión (tal vez para agregar una corrección de backport)
Freelancer

1
El segundo comando es lo que estaba buscando. Tenga en cuenta que -Iy --ignore-installedson las mismas banderas y, por supuesto, no es válido tener una ,allí. De esta manera, no se producirán degradaciones durante la instalación y una vez completada la instalación de los requisitos, se pueden actualizar los paquetes instalados mediante pip-review --auto.
AXO

79

Ya respondí esta pregunta aquí . Esta es mi solución:

Debido a que no había una manera fácil de actualizar paquete por paquete y actualizar el archivo requirements.txt, escribí este pip-upgradeder que también actualiza las versiones en su requirements.txtarchivo para los paquetes elegidos (o todos los paquetes).

Instalación

pip install pip-upgrader

Uso

Active su virtualenv (importante, porque también instalará las nuevas versiones de paquetes actualizados en virtualenv actual).

cd en el directorio de su proyecto, luego ejecute:

pip-upgrade

Uso avanzado

Si los requisitos se colocan en una ubicación no estándar, envíelos como argumentos:

pip-upgrade path/to/requirements.txt

Si ya sabe qué paquete desea actualizar, simplemente envíelos como argumentos:

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

Si necesita actualizar a la versión preliminar / posterior, agregue un --prereleaseargumento a su comando.

Divulgación completa: escribí este paquete.


5
¡Excelente! Es sorprendente que dicha función no esté presente directamente en pip
Jacopofar

5
¡Elegante!
Muy

3
Acabo de usar esto, y esto es lo mejor desde F-strings.
Pierre.Sassoulas

1
Gran herramienta. Gracias.
mszaro

¡Herramienta muy útil! También encontré otro paquete llamado pur que también actualiza las versiones
ancladas

4

Sugiero congelar todas sus dependencias para tener compilaciones predecibles .

Al hacer eso, puede actualizar todas las dependencias a la vez de esta manera:

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

Una vez hecho lo anterior, pruebe su proyecto con el nuevo conjunto de paquetes y, finalmente, envíe el requirements.txtarchivo al repositorio.


3

Solo tuve que hacer lo mismo ... usé este pequeño resumen para hacer el trabajo:

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

cual:

  • packages=$(cat requirements.txt | sed 's/==.*//g') crea una lista de los nombres de los paquetes actuales en requirements.txt (eliminando la versión).
  • echo $packages | xargs pip3 install -U luego pasa todos los paquetes como argumentos a pip3 para actualizar.
  • freeze=$(pip3 freeze); Obtiene todas las versiones actuales del paquete en el formato requerido para requirements.txt
  • for p in $(echo $packages) luego recorre los nombres de los paquetes
    • echo $freeze | grep -E "^${p}==" >> requirements.new obtiene la línea de versión del paquete de la salida de pip freeze que coincide con el paquete y escribe en los nuevos requisitos.txt

Esto tiene el beneficio adicional de preservar el orden de los requisitos originales.txt. :)

¡Espero que esto ayude!


2

Como no podía hacer eso usando bash, escribí un módulo de Python para crear un nuevo archivo de requisitos sin versiones y lo usé:

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()

Luego instale las librerías desde el nuevo archivo pip install -U -r requirements-prod-no-version.pip

Finalmente congele las versiones al archivo original pip freeze > requirements-prod.pip


2

Otra solución es utilizar el paquete de requisitos de actualización

pip install upgrade-requirements

Y luego ejecuta:

upgrade-requirements

Actualizará todos los paquetes que no estén en sus últimas versiones y también creará un requirements.txt actualizado al final.


0
  • 1) Para actualizar los archivos instalados de pip desde reqs.txt agregue el > = en reemplazo de == esto le dirá a pip que instale una lib mayor o igual a la versión que está solicitando, aquí instalando la versión más actualizada de la biblioteca solicitada

    1.a) ** Mi respuesta para el hilo ** Al agregar py -m pip install -r reqs.txt a un reinicio diario ... o algo por el estilo, puede actualizar sus bibliotecas instaladas. Resumido por Andy perfectamente

    -Mi razón para ingresar a este hilo fue encontrar información sobre cómo actualizar el pip base del entorno virtual (generalmente 10.0.03 para mí?)

con la esperanza de satisfacer un problema del cual pude derivar una de dos soluciones

A. creación de venv || B. Instalación de las bibliotecas necesarias

Gracias a Andy he satisfecho la necesidad B

Añadiendo pip > = versión solicitada en reqs.txt

al crear una instancia del nuevo entorno virtual || re-instanciación de Venv anterior

  1. py -m venv devenv

para configurar un nuevo dev env

  1. reevenv\scripts\activate.bat

para activar dev env

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

para instalar librerías base

salida de yeilds

Recopilación de pip > = 20.0.2 (de -r requirenments.txt (línea 1)) Usando caché> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662cpy13f3/pip.-20.03.2-py2 none-any.whl

Instalación existente encontrada: pip 10.0.1

Desinstalación de pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Perdón por el Brain Dump, espero que esto ayude a alguien :)

🤳 Austin 👨‍🎤🚀🥊


0

La segunda respuesta es la más útil, pero lo que quería hacer era bloquear algunos paquetes y tener otros en la última versión (por ejemplo, youtube-dl).

Un ejemplo requirements.txtse vería así (~ significa compatible):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Luego, en la terminal, usa el comando pip install --upgrade -r requirements.txt

Esto asegura que Pillow se mantendrá en 6.2.2, las solicitudes se actualizarán a la última 2.22.x (si está disponible) y se instalará la última versión de youtube-dl si aún no lo está.


0

Supongo que la solución más simple es crear requirements.txt con:

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

-1

Si instala algo en su proyecto django y después de la instalación desea actualizar su archivo de requisitos, este comando puede actualizar su archivo requisito.txt pip freeze> requirements.txt

si su archivo de requisitos no existe en su proyecto, puede usar este comando para crear un nuevo archivo require.txt pip freeze> requirements.txt


esta es una mala idea porque también agregará los requisitos de todos sus requisitos, lo que resultará en un archivo de requisitos innecesariamente grande. Si luego decide actualizar una sola dependencia, es probable que tenga conflictos de versiones, a menos que sepa qué otros requisitos se agregaron a su archivo de requisitos debido a ese paquete.
disturbios el

-10

Edito requirements.txt como se muestra a continuación y ejecuto $ 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
Este es un ejemplo ideal del anti-patrón. Lo que está mal aquí: 1) Requirements.txt es un archivo .txt, pero lo ha hecho ejecutable 2). Hay un comando pip install -r requirements.txt simple. Por lo tanto, puede usar el archivo requirements.txt solo para enumerar las dependencias de su proyecto. 3) No está utilizando versiones de los paquetes. 4) No es un patrón común, otros desarrolladores no hacen nada sobre cómo usarlo. 5) Difícil de usar con canalizaciones CI / CD. Por favor, no use este ejemplo
Fannigurt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.