¿Cómo puedo actualizar paquetes específicos usando pip y un archivo de requisitos?

437

Estoy usando pip con un archivo de requisitos, en virtualenv, para mis proyectos de Django. Estoy tratando de actualizar algunos paquetes, especialmente Django, y recibo un error sobre los conflictos del código fuente:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

Eso es después de actualizar el número de versión de Django de 1.2.3 a 1.2.4 en mi archivo de requisitos. Estoy usando este comando para hacer la actualización:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

No puedo encontrar ninguna marca que desencadene una descarga total del paquete. Incluso intenté ejecutar primero un comando de desinstalación, luego la instalación pero no los dados. Tal vez me estoy perdiendo algo?

gcaprio
fuente
1
Verifique la respuesta de @ dr-jimbob porque las versiones recientes de pip realmente actualizarán todas las demás dependencias de las que depende el paquete que está actualizando.
Lokesh Meher

Respuestas:

61

No estoy seguro de si es exactamente su problema, pero en mi caso, no pude actualizar Django a 1.2.4: siempre terminaba con la versión 1.2.3, así que desinstalé Django con:

<virtualenv>/bin/pip uninstall Django

Luego eliminé el <virtualenv>/build/Djangodirectorio y finalmente instalé la versión adecuada con:

<virtualenv>/bin/pip install Django

Espero que esto ayude.

Marcin Świerczyński
fuente
53
Esta no es la mejor práctica. Use pip install Django -Uo pip install Django --upgradecomo se describe en la respuesta de @JoeyG.
Ahmad
@ Ahmad está de acuerdo. Debe haber un proceso de actualización sin problemas en pip y virtual env.
Parth Joshi
1274

Ejecuté el siguiente comando y se actualizó de 1.2.3 a 1.4.0

pip install Django --upgrade

Atajo para la actualización:

pip install Django -U

Nota : si el paquete que está actualizando tiene algún requisito, este comando también actualizará todos los requisitos a las últimas versiones disponibles. En versiones recientes de pip, puede evitar este comportamiento especificando--upgrade-strategy only-if-needed . Con ese indicador, las dependencias no se actualizarán a menos que las versiones instaladas de los paquetes dependientes ya no satisfagan los requisitos del paquete actualizado.

JoeyG
fuente
77
¡Esto para mí actualizó todo mi paquete y lo arruinó todo! Estados de documentos: - Actualice todos los paquetes a la versión más nueva disponible. ¿Es correcto o hice algo mal?
Prometheus
44
@OrbiterFleet Necesitaba actualizar las "solicitudes", así que lo hice pip install Requests --upgradey solo se actualizaron las "solicitudes". La descripción dice "actualizar todos los paquetes especificados " cuando veo los documentos.
Harperville
31
ATENCIÓN, también actualiza todas las dependencias y puede estropear todo. La mejor opción es desinstalar y reinstalar el paquete.
marcelosalloum
3
para actualizar el uso específico del paquetepip install --upgrade django==1.4.0
whale_steward
esta debería ser la respuesta correcta de acuerdo con la pregunta o la pregunta en sí es incorrecta.
int soumen
51

de acuerdo con pip docs ejemplo 3

pip install --upgrade django

pero según mi experiencia, el uso de este método también actualizará cualquier paquete relacionado con él. ejemplo:

Suponga que desea actualizar somepackage que requiere el django >= 1.2.4uso de este tipo de método, también se actualizará somepackageY djangoa la actualización más reciente. Solo para estar seguro hacer:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

Hacer esto actualizará somepackagey mantendrá django a la versión 1.2.4

whale_steward
fuente
Buena captura, pero su explicación es confusa ya que comenzó djangocomo un paquete principal y luego en el ejemplo que usa somepackagey luego usa djangocomo una dependencia.
Largo
34

El comando de acceso directo para --upgrade:

pip install Django --upgrade

Es:

pip install Django -U
Aaron Lelevier
fuente
77
¿Qué tal editar la respuesta existente para agregar este bit de información en lugar de una respuesta (incompleta)?
a1an
@ a1an sugiera qué información adicional cree que debería agregarse en una "edición sugerida". Gracias
Aaron Lelevier
44
Quiero decir que podría editar la respuesta dada por JoeyG, agregando la opción de acceso directo que proporcionó allí en contexto.
a1an
17

Si actualiza un paquete, el antiguo se desinstalará.

Una forma conveniente de hacer esto es usar este pip-upgrade que también actualiza las versiones en surequirements.txt archivo 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 su directorio de 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 anterior al lanzamiento / posterior al lanzamiento, agregue un --prereleaseargumento a su comando.

Divulgación completa: escribí este paquete. Espero eso ayude.

Simion Agavriloaei
fuente
1
¿Existe una opción para actualizar todos los paquetes a la vez (es decir, sin enumerarlos) con este enfoque?
Fanático número uno de Bjorks
1
@MikePalmice sí: pip-upgrade -p allactualizará todos sus paquetes y actualizará el archivo de requisitos sin necesidad de ninguna aportación suya .
Simion Agavriloaei
16

Si solo desea actualizar un paquete específico llamado somepackage, el comando que debe usar en las versiones recientes de pip es

pip install --upgrade --upgrade-strategy only-if-needed somepackage

Esto es muy útil cuando desarrolló una aplicación en django que actualmente solo funcionará con una versión específica de django (por ejemplo, Django = 1.9.x) y desea actualizar algún paquete dependiente con una función de corrección de errores / nueva y el paquete actualizado depende en django (pero funciona con cualquier versión de django después de 1.5). El comportamiento predeterminado de pip install --upgrade django-some-packagesería actualizar django a la última versión disponible que de otro modo podría dañar su aplicación, aunque con los --upgrade-strategy only-if-neededpaquetes dependientes ahora solo se actualizará según sea necesario.

dr jimbob
fuente
4

Normalmente, pip se limpiará después de sí mismo y eliminará el contenido del directorio de compilación. El único momento en que no hace esto es si:

  1. Usaste el --no-install opción
  2. Estás usando paquetes editables
  3. La instalación se canceló o se interrumpió de otra manera.

En todos los demás casos, no debería tener un builddirectorio que esté obstruyendo su entorno.

Burhan Khalid
fuente
1

Definir una versión específica para actualizar me ayudó en lugar de solo el comando de actualización.

pip3 install larapy-installer==0.4.01 -U
Bedram Tamang
fuente
0

eso resolvió para mí el problema "pip install -I --uprate psutil --force" luego simplemente desinstale psutil con la nueva versión y espere que pueda instalar de repente la versión anterior (:

Eran Hpac
fuente
0

Yo uso esto:

pip3 install -r  requirements.txt  
Shahab Rahnama
fuente