¿Cómo instalar un paquete con un rango de versiones mínimo y máximo?

233

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 debe instalarse (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 menor más reciente de la rama 0.5.x, pero no quiero que pip intente instalar ninguna versión principal más nueva (como 0.6.x) desde La API es diferente. Esto es importante porque aunque la rama 0.6.x está disponible, los desarrolladores todavía están lanzando parches y correcciones de errores a la rama 0.5.x, por lo que no quiero usar una package==0.5.9línea estática en mi archivo de requisitos.

¿Hay alguna manera de hacerlo?

coredumperror
fuente

Respuestas:

301

Tu puedes hacer:

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

Y pipbuscará la mejor coincidencia, suponiendo que la versión sea al menos 0.2 y menos de 0.3.

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

Hugo Tavares
fuente
Enlace muerto Documentación oficial aquí .
beatgammit
45
Para el registro, creo "package>=0.2,<=0.3"que no tiene mucho sentido: ¿cuándo estarías de acuerdo con 0.2 y 0.3.0, pero no con ninguno de los lanzamientos de corrección de errores de 0.3? Creo que "package>=0.2,<0.3"es un ejemplo mucho mejor, porque refleja el caso común de decir: "por favor, denme la última versión de corrección de errores de la versión menor actual, pero no me actualicen automáticamente a la próxima versión menor, porque me gustaría hacerlo explícitamente, asegurándome de que no haya cambios funcionales que me afecten ".
Henrik Heimbuerger
Si te gusta esta respuesta, ¡te encantará la respuesta de Mortiz justo debajo! Asegúrese de verificarlo, ~=0.2es (en mi humilde opinión) una mejor solución que esta.
Brad Root
1
@BradRoot No está realmente claro qué ~=0.2.1haría, por ejemplo. Ser explícito como en >=0.2,<0.3es bueno porque está muy claro lo que está sucediendo.
Acumenus
@Acumenus alguien que entienda las propiedades del formato del requisito y cómo funciona el control de versiones no escribiría ~=0.2.1en un archivo de requisitos. Ese es un error del usuario, no una desventaja del ~=prefijo.
Brad Root el
86

también puedes usar:

pip install package==0.5.*

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

lowrin
fuente
12
Esta es una forma mucho mejor de administrar requirements.txtIMO. El uso en package==1.*lugar de package>=1.2evita que pip instale la versión principal 2+ para el paquete, lo cual es deseable ya que los cambios importantes de la versión a menudo son incompatibles con versiones anteriores.
Michael Hays
10
Tenga en cuenta que esto no actualiza un paquete existente. por ejemplo, si tiene 0.5.1 instalado, pero 0.5.2 es el último, y ejecuta install 0.5. * dirá "ya satisfecho" y lo dejará con 0.5.1. Añadiendo --upgrade lo resuelve.
scipilot
71

Un método elegante sería utilizar el ~=operador de liberación compatible de acuerdo con PEP 440 . En su caso, esto equivaldría a:

package~=0.5.0

Como 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.*
Moritz
fuente
¿Cómo usarías esto para versiones truncadas? Por ejemplo, si hay un 2.2futuro planificado 2.2.1, ¿ ~=2.2.*coincidirá a 2.2pesar de que no haya un número terciario?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Debe usar ~=2.2.0en ese caso (el *operador no funcionará si está usando ~=). 2.2y 2.2.0(y 2.2.0.0, etc.) se manejan internamente como lo mismo cuando se trata de instalar paquetes.
ik1ne
No está muy claro cómo funciona esto para la numeración de versiones anidadas, por ejemplo ~=1.2.3. Es mucho más explícito y más claro usar el formulario de múltiples cláusulas en su lugar.
Acumenus
2
@MitchMcMabers Eso solo funciona si las características que deseas están presentes en la primera versión de esa versión principal, lo cual 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. El operador ~=(o >=más <si le resulta difícil de leer) es mejor porque alienta a ser correctamente específico.
Maxpm
1
@Maxpm Ese es un buen punto. Por == 1.*lo tanto , fallaría y no haría nada si necesitamos una función de versión 1.2 pero el usuario ya tenía instalado 1.1. Su propuesta ~= 1.2es lo mismo que decir >= 1.2, < 2.0(o >= 1.2, == 1.*). Entonces sí, tiene razón, ~=es el mejor operador, ya que le permite orientar la versión de desarrollo que utilizó de una biblioteca, al tiempo que permite versiones más nuevas dentro de la misma versión principal. Gracias por esa aclaración!
Mitch McMabers