¿Cómo instalar pip en un paquete con un rango de versión mínimo y máximo?

5 minutos de lectura

avatar de usuario
error de volcado de núcleo

Me pregunto si hay alguna forma de decirle a pip, específicamente en un archivo de requisitos, que instale un paquete con una versión mínima (pip install package>=0.2) y una versión máxima que nunca se debe instalar (api teórica: pip install package<0.3).

Pregunto porque estoy usando una biblioteca de terceros que está en desarrollo activo. Me gustaría que mi archivo de requisitos de pip especifique que siempre debe instalar la versión secundaria más reciente de la rama 0.5.x, pero no quiero que pip intente instalar versiones principales más nuevas (como 0.6.x) ya que la API es diferente. Esto es importante porque, aunque la rama 0.6.x está disponible, los desarrolladores siguen lanzando parches y correcciones de errores para la rama 0.5.x, por lo que no quiero usar una rama estática. package==0.5.9 línea en mi archivo de requisitos.

¿Hay alguna manera de hacerlo?

avatar de usuario
Hugo Tavares

Tu puedes hacer:

$ pip install "package>=0.2,<0.3"

Y pip buscará la mejor coincidencia, suponiendo que la versión sea al menos 0.2 e inferior a 0.3.

Esto también se aplica a la pipa archivos de requisitos. Consulte los detalles completos sobre los especificadores de versión en PEP 440.

  • Para que conste, creo "package>=0.2,<=0.3" no tiene mucho sentido: ¿cuándo estarías de acuerdo con 0.2 y 0.3.0, pero no con ninguna de las versiones de corrección de errores de 0.3? pienso "package>=0.2,<0.3" es un ejemplo mucho mejor, porque refleja el caso común de decir: “Dame la última versión de corrección de errores de la versión secundaria actual, pero no me actualices automáticamente a la siguiente versión secundaria, porque me gustaría hacerlo explícitamente , asegurándome de que no haya cambios funcionales que me afecten”.

    – Henrik Heimbuerger

    29 de mayo de 2014 a las 10:19


  • Si te gusta esta respuesta, ¡te encantará la respuesta de Mortiz justo debajo! Asegúrate de comprobarlo, ~=0.2 es (en mi humilde opinión) una solución mejor que esta.

    – Brad Raíz

    22 de abril de 2019 a las 17:24

  • @BradRoot Realmente no está claro qué ~=0.2.1 haría, por ejemplo. Siendo explícito como en >=0.2,<0.3 es algo bueno porque está muy claro lo que está pasando.

    – Asclepio

    1 de noviembre de 2019 a las 16:06


  • @Acumenus alguien que entiende las propiedades del formato de requisito y cómo funciona el control de versiones no escribiría ~=0.2.1 en un archivo de requisitos. Eso es un error del usuario, no una desventaja del ~= prefijo.

    – Brad Raíz

    7 de noviembre de 2019 a las 18:15

  • @BradRoot no lo haría ~=0.2.1 significar >=0.2.1,<0.3? ¿Cómo es un error de usuario?

    – Asclepio

    7 de noviembre de 2019 a las 21:27

también puedes usar:

pip install package==0.5.*

que es más consistente y fácil de leer.

  • Esta es una manera mucho mejor de administrar requirements.txt OMI. Usando package==1.* en vez de package>=1.2 evita que pip instale la versión principal 2+ para el paquete, lo cual es deseable ya que los cambios de versión principal a menudo son incompatibles con versiones anteriores.

    – Michael Hays

    18 de enero de 2018 a las 18:41


  • Tenga en cuenta que esto no actualiza un paquete existente. por ejemplo, si tiene 0.5.1 instalado, pero 0.5.2 es la última versión, y ejecuta install 0.5.*, dirá “ya satisfecho” y lo dejará con 0.5.1. Agregar –upgrade lo resuelve.

    – scipilot

    6 de abril de 2018 a las 8:05


  • Esto no funciona para mi pip install matplotlib==3.2.* zsh: no matches found: matplotlib==3.2.*

    – tbrodbeck

    16 de junio de 2021 a las 6:32


  • @Tillus, el signo zodiacal está siendo expandido por zsh (al igual que cuando ejecuta rm myfiles*. Debe escapar del argumento, por ejemplo, con comillas simples pip install 'matplotlib==3.2.*'.

    – Adir

    1 de julio de 2021 a las 8:52

Un método elegante sería usar el ~= operador de liberación compatible según PEP 440. En tu caso esto equivaldría a:

package~=0.5.0

A modo de ejemplo, si existen las siguientes versiones, elegiría 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Para aclarar, cada par es equivalente:

~= 0.5.0
>= 0.5.0, == 0.5.*

~= 0.5
>= 0.5, == 0.*

  • @ Mike’Pomax’Kamermans Deberías usar ~=2.2.0 en ese caso(* operador no funcionará si está utilizando ~=). 2.2 y 2.2.0 (y 2.2.0.0etc.) se manejan internamente como lo mismo cuando se trata de instalar paquetes.

    – ik1ne

    23 de mayo de 2019 a las 8:15


  • No está muy claro cómo funciona esto para la numeración de versiones anidadas, por ejemplo ~=1.2.3. En su lugar, es mucho más explícito y claro usar el formulario de varias cláusulas.

    – Asclepio

    1 de noviembre de 2019 a las 16:05


  • @MitchMcMabers Eso solo funciona si las funciones que desea estaban presentes en la primera versión de esa versión principal, lo que no es cierto en general. Si confía en algo que se agregó en v1.2.0, por ejemplo, == 1.* aceptará incorrectamente v1.1.0. los ~= (o >= más < si encuentra que es difícil de leer) el operador es mejor porque alienta a ser correctamente específico.

    – Máxpm

    15 de febrero de 2020 a las 1:56

  • @Maxpm Ese es un buen punto. Asi que == 1.* fallaría y no haría nada si necesitamos una característica de la versión 1.2 pero el usuario ya tiene instalada la 1.1. tu propuesta ~= 1.2 es lo mismo que decir >= 1.2, < 2.0 (o >= 1.2, == 1.*). Así que sí tienes razón, ~= es el mejor operador ya que le permite apuntar a la versión de desarrollo que usó de una biblioteca, al tiempo que permite versiones más nuevas dentro del mismo versión principal. ¡Gracias por esa aclaración!

    – Mitch McMabers

    17 de febrero de 2020 a las 18:44


  • Me parece muy raro que numpy~=1.17.0 descargas 1.17.5, pero numpy~=1.17 descargas 1.18.5.

    – nada101

    15 de junio de 2020 a las 5:50

nok.github.io/pipdev es una herramienta interactiva para que los desarrolladores prueben especificadores definidos para el manejo de versiones.

ingrese la descripción de la imagen aquí

Relacionado con la pregunta: nok.github.io/pipdev?spec=~=0.5.0&vers=0.6

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad