Instalación de múltiples versiones de un paquete con pip

83

En mi aplicación me gustaría usar:

  • packageA, que requiere packageX==1.3
  • packageB, que requiere packageX==1.4
  • packageX==1.5

¿Cómo puedo instalar varias versiones de packageXcon pip para manejar esta situación?

limboy
fuente
2
instale paquetes en ubicaciones no estándar, luego use PYTHONPATH para determinar cuál importar; vea esta respuesta
Yibo Yang
1
En una nota al margen, el escenario en esta pregunta y la solución hacky en la respuesta actualmente aceptada son un buen ejemplo de por qué el propietario de un paquete no debe ni debe ser exigente para fijar una versión exacta de su dependencia. Deberían haber estado usando packageX>=1.3,<2y packageX>=1.4,<2(asumiendo que el packageX ascendente está siguiendo el control de versiones semántico ), entonces usted, como desarrollador de la aplicación descendente, no tendría ningún problema para anclar y usar packageX==1.5y todos estarían felices. Más detalles aquí
RayLuo

Respuestas:

63

pip no te ayudará con esto.

Puede decirle que instale una versión específica, pero anulará la otra. Por otro lado, usar dos virtualenvs te permitirá instalar ambas versiones en la misma máquina, pero no usarlas al mismo tiempo.

Lo mejor es instalar ambas versiones manualmente, colocándolas en su ruta de Python con un nombre diferente.

Pero si sus dos bibliotecas esperan que tengan el mismo nombre (y deberían), tendrá que modificarlas para que obtengan la versión que necesitan con algún alias de importación como:

import dependencyname_version as dependencyname

Actualmente no hay una forma limpia de hacer esto. Lo mejor que puedes esperar es que este truco funcione.

Prefiero deshacerme de una de las dos bibliotecas y reemplazarla por una equivalente, o parchearla para aceptar la nueva versión de la dependencia y devolver el parche a la comunidad.

e-satis
fuente
41
¿Todavía no hay solución para esto?
Håken Lid
2
¿Todavía no hay solución?
AjaxLeung
1
Muchos lenguajes tienen este problema ... Java, Go, Haxe ... con suerte, los diseñadores de lenguajes abandonarán los espacios de nombres de paquetes globales y adoptarán un sistema de módulos más similar a Node.js en los futuros lenguajes que creen, ya que Node.js admite múltiples versiones de dependencias.
Andy
15

Descargue la fuente de ea. paquete. Instale cada uno en su propia carpeta separada. Por ejemplo. Tenía el paquete de la versión 1.10, pero quería cambiar a la versión dev para trabajar un poco. He descargado la fuente para el módulo dev: git clone https://github.com/networkx/networkx.git cd netwokrx He creado una carpeta para esta versión: mkdir /home/username/opt/python, entonces me puse el PYTHONPATH env var a: export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. A continuación, lo instalé usando:python setup.py install --prefix=/home/username/opt/python

Ahora, dado que mi PYTHONPATH ahora apunta a esta otra carpeta de paquetes de sitio, cuando ejecuto Python en la línea de comandos e importo el nuevo módulo, funciona. Para volver a cambiar, elimine la nueva carpeta de PYTHONPATH.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'
sAguinaga
fuente
2
¡Ah, vine aquí específicamente porque estoy luchando contra las networkxdiferencias de versión!
dwanderson
"Para volver a cambiar, elimine la nueva carpeta de PYTHONPATH.", Esta parte no me funciona incluso después de eliminar la nueva ruta de la carpeta desys.path
Avinash Raj