90
votes

In my application I would like to use:

  • packageA, which requires packageX==1.3
  • packageB, which requires packageX==1.4
  • packageX==1.5

How can I install multiple versions of packageX with pip to handle this situation?

2
install packages to non-standard locations, then use PYTHONPATH to determine which one to import; see this answer - Yibo Yang
On a side note, the scenario in this question, and the hacky solution in the currently accepted answer are a good example of why a package owner should not and must not be picky to pin an exact version of their dependency. They should have been using packageX>=1.3,<2 and packageX>=1.4,<2 (assuming the upstream packageX is following Semantic Versioning), then you as the downstream app developer would have no problem to pin and use packageX==1.5 and everyone would be happy. More details here - RayLuo
Hmm. Maybe the new brackets for optional packages main_package[opt] could help - HashRocketSyntax

2 Answers

72
votes

pip won't help you with this.

You can tell it to install a specific version, but it will override the other one. On the other hand, using two virtualenvs will let you install both versions on the same machine, but not use them at the same time.

You best bet is to install both version manually, by putting them in your Python path with a different name.

But if your two libs expect them to have the same name (and they should), you will have to modify them so they pick up the version they need with some import alias such as:

import dependencyname_version as dependencyname

There is currently no clean way to do this. The best you can hope is for this hack to work.

I'd rather ditch one of the two libs and replace it with an equivalent, or patch it to accept the new version of the dependency and give the patch back to the community.

15
votes

Download the source for ea. package. Install each on its own separate folder. For example. I had version 1.10 package, but wanted to switch to the dev version for some work. I downloaded the source for the dev module: git clone https://github.com/networkx/networkx.git cd netwokrx I created a folder for this version: mkdir /home/username/opt/python, then I set the PYTHONPATH env var to: export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/. Next, I installed it using: python setup.py install --prefix=/home/username/opt/python

Now, since my PYTHONPATH is now pointing to this other site-packages folder, when I run python on the command line, and import the new module, it works. To switch switch back, remove the new folder from PYTHONPATH.

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'