В моей системе несколько модулей установлены несколько раз. Чтобы привести пример, numpy 1.6.1 установлен в стандартном пути в /usr/lib/python2.7/dist-packages, и у меня есть обновленная версия numpy 1.8.0, установленная в /local/python/lib/python2.7/site-packages/.
Причина, по которой я не могу просто удалить старую версию, состоит в том, что у меня нет прав на изменение чего-либо на моем рабочем компьютере. Однако мне нужно использовать новую версию numpy.
Я добавил /local/python/lib/python2.7/site-packages/ к моему PYTHONPATH. К сожалению, это не помогает, поскольку /usr/lib/python2.7/dist-packages сначала вставляется в путь, и поэтому загружается numpy 1.6.1. Вот пример:
>>> 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',
...]
Итак, кажется, что порядок импорта
- текущий каталог
- яйца от
PYTHONPATH - яйца из локального пути модуля (
~/.local/lib/python2.7/site-packages/*.egg) - путь всей системы (
~/usr/lib/python2.7/dist-packages/) - каталоги из
PYTHONPATH - промежуточные пути (опущены для краткости)
- каталог базы данных (
~/.local/lib/python2.7/site-packages/)
Моя проблема в том, что мне нужно будет поставить элемент 5. перед пунктами 3. и 4. чтобы мой код работал правильно. Прямо сейчас, если я импортирую модуль, который был скомпилирован с numpy 1.8.0 из каталога /local/*, и этот модуль импортирует numpy, он все равно будет принимать numpy из каталога /usr/* и терпит неудачу.
Я обошел эту проблему, разместив что-то вроде этого в моих скриптах:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Таким образом, я могу заставить Python использовать правильный порядок импорта, но, конечно, это не решение, так как я должен был бы сделать это в каждом script.