On my system, I have several modules installed multiple times. To give an example, numpy 1.6.1
is installed in the standard path at /usr/lib/python2.7/dist-packages
, and I have an updated version of numpy 1.8.0
installed at /local/python/lib/python2.7/site-packages/
.
The reason I cannot simply remove the old version is that I do not have permissions to change anything on my work computer. I however need to use the new numpy version.
I have added /local/python/lib/python2.7/site-packages/
to my PYTHONPATH
. Unfortunately, this does not help, since /usr/lib/python2.7/dist-packages
is inserted into the path first and therefore, numpy 1.6.1
will be loaded. Here's an example:
>>> import os
>>> print os.environ['PYTHONPATH']
/local/python/lib/python2.7/site-packages
>>> import pprint
>>> import sys
>>> pprint.pprint(sys.path)
['',
'/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg',
'/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.egg',
'~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.egg',
'~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.egg',
'/usr/lib/python2.7/dist-packages',
'/local/python/lib/python2.7/site-packages',
'/usr/lib/python2.7',
...,
'~/.local/lib/python2.7/dist-packages',
...]
So, it seems that the import order is
- current directory
- eggs from
PYTHONPATH
- eggs from local module path (
~/.local/lib/python2.7/site-packages/*.egg
) - system-wide module path (
~/usr/lib/python2.7/dist-packages/
) - directories from
PYTHONPATH
- intermediate paths (omitted for brevity)
- userbase directory (
~/.local/lib/python2.7/site-packages/
)
My problem is that I would need to put item 5. before items 3. and 4. for my code to work properly. Right now, if I import a module that was compiled against numpy 1.8.0
from the /local/*
directory, and this module imports numpy, it will still take numpy from the /usr/*
directory and fail.
I have circumvented this problem by placing something like this in my scripts:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Thereby I can force Python to use the right import order, but of course this is not a solution, since I would have to do this in every single script.
usercustomize.py
to force-reorder or prune the paths across all of your own code, assuming you can get a file into the site-packages directory of your base install. Check the docs for the site module docs.python.org/2/library/site.html – Selfpity