Подтвердить что ты не робот

Python: выберите одну из нескольких версий установленных модулей

В моей системе несколько модулей установлены несколько раз. Чтобы привести пример, 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.

4b9b3361

Ответ 1

Помимо предложений, уже приведенных в разделе комментариев, вы подумали об использовании virtualenv? Это даст вам тонкий контроль над каждым модулем, который вы хотите использовать. Если вы не знакомы с virtualenv, вы захотите прочитать документацию, чтобы понять, как она работает.

Например, вы можете установить и настроить его так, как будто (virtualenv-1.11.6 выглядит, чтобы быть самой последней версией в настоящее время ):

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz
$ tar xvfz virtualenv-1.11.6.tar.gz
$ cd virtualenv-1.11.6
$ python virtualenv.py ../numpyvenv
$ cd ../numpyvenv
$ source ./bin/activate
(numpyvenv) $ pip install numpy
# downloads, compiles, and installs numpy into the virtual environemnt
(numpyvenv) $ python
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.9.1'
>>> quit()
(numpyvenv) $ deactivate
$ # the virtual environment has been deactivated

Выше мы создали виртуальную среду с именем "numpyvenv", активировали среду, установили numpy, напечатали версию numpy (чтобы показать, что она работает), закройте python и отключите среду. В следующий раз, когда вы активируете среду, будет существовать numpy вместе с любыми другими установленными вами модулями. Вы можете столкнуться с икотой при попытке этого, но вам нужно начать.

Ответ 2

У меня была эта проблема на Mac, который я использовал без доступа администратора. Мое решение было следующее:

  • Найдите каталог версии numpy, которую вы хотите использовать. Для меня это было /Library/Python/2.7/site-packages

  • Создайте файл ~/.startup.py и укажите на него PYTHONSTARTUP=~/.startup.py в вашем .bashrc файле

  • В .startup.py:

import sys

sys.path.insert(0,'/Library/Python/2.7/site-packages/') < --- импортирует это перед стандартными частями

import numpy

print("Importing numpy version"+numpy.__version__) < ---- Напомним, что мы изменили версию numpy

Кажется, это работает отлично для меня. Надеюсь, это поможет.

Ответ 3

У меня была такая же проблема с Debian Wheezy после установки последнего numpy-модуля с easy_install.

Новый модуль numpy был установлен в /usr/local/lib/python2.7/dist-packages/numpy, а старый модуль находился в /usr/lib/pymodules/python2.7/numpy. Когда я попытался импортировать модуль numpy, старшая версия была импортирована. И, как вы говорите, добавление в PYTHONPATH нового пути к модулю не помогает, потому что добавлено в sys.path ниже старой записи.

Проблема, похоже, находится в easy-install, потому что она создает файл easy-install.pth, который импортирует /usr/lib/pymodules/python 2.7 перед любым локальным модулем.

Исправить проблему Я просто отредактировал файл /usr/local/lib/python2.7/dist-packages/easy-install.pth и прокомментировал строку /usr/lib/pymodules/python2.7, поэтому эта строка будет помещена ниже в sys.path.