Pip выполняет неправильные версии библиотеки python внутри виртуального env - программирование
Подтвердить что ты не робот

Pip выполняет неправильные версии библиотеки python внутри виртуального env

Я создаю виртуальную среду с virtualenvwrapper, а затем я пытаюсь установить django в нее с помощью pip. Однако я продолжаю получать ошибку из-за конфликта в версиях python.

$ mkvirtualenv env
$ workon env
$ pip install django
Downloading/unpacking django
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/basecommand.py", line 134, in main
    status = self.run(options, args)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/commands/install.py", line 236, in run
    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/req.py", line 1085, in prepare_files
    url = finder.find_requirement(req_to_install, upgrade=self.upgrade)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/index.py", line 201, in find_requirement
    page = self._get_page(main_index_url, req)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/index.py", line 554, in _get_page
    return HTMLPage.get_page(link, req, cache=self.cache)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/index.py", line 671, in get_page
    resp = urlopen(url)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/download.py", line 176, in __call__
    response = self.get_opener(scheme=scheme).open(url)
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/download.py", line 238, in get_opener
    headers.append(("User-agent", build_user_agent()))
  File "/Users/mingot/virtualenvs/env/lib/python2.7/site-packages/pip/download.py", line 35, in build_user_agent
    _implementation = platform.python_implementation()
  File "/Users/mingot/soft/anaconda/lib/python2.7/platform.py", line 1486, in python_implementation
    return _sys_version()[0]
  File "/Users/mingot/soft/anaconda/lib/python2.7/platform.py", line 1451, in _sys_version
    repr(sys_version))
ValueError: failed to parse CPython sys.version: '2.7.5 (default, Aug 25 2013, 00:04:04) \n[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]'

В системе я запускаю pacon anaconda:

$ python 
Python 2.7.5 |Anaconda 1.8.0 (x86_64)| (default, Oct 24 2013, 07:02:20) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin

и $PATH установлено значение

/Users/mingot/soft/anaconda/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/texbin:/opt/X11/bin

находясь внутри виртуальной среды, версия python:

(env)$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin

и $PATH:

/Users/mingot/virtualenvs/env/bin:/Users/mingot/soft/anaconda/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/texbin:/opt/X11/bin

Я понимаю, что проблема заключается в том, что внутри виртуальной среды при выполнении non anaconda python 2.7.5 она по-прежнему использует platforms.py из библиотеки anaconda, что приводит к сбою в оценке регулярного выражения, как предлагается . Мне все равно, какая версия python будет использоваться внутри виртуальной среды. Любое предложение о том, как правильно определить питон внутри виртуальной среды platforms.py?

Спасибо!

4b9b3361

Ответ 1

Я столкнулся с той же проблемой на Mac с установленной Anaconda. То, как я исправил это, это поиск platform.py, а затем изменение следующего (комментирование строки):

ОРИГИНАЛ

_sys_version_parser = re.compile(
    r'([\w.+]+)\s*'
    '\|[^|]*\|\s*' # version extra
    '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
    '\[([^\]]+)\]?')

ИЗМЕНИТЬ

_sys_version_parser = re.compile(
    r'([\w.+]+)\s*'
    #'\|[^|]*\|\s*' # version extra # Just comment this line out
    '\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
    '\[([^\]]+)\]?')

Это с virtualenv == 1.10.1 и anaconda 1.9.2

Ответ 2

Решение, которое я в итоге делаю, создает символическую ссылку на platforms.py внутри папки библиотеки виртуальной среды из файла библиотеки правильной версии python.

$ pwd
/Users/mingot/virtualenvs/env/lib/python2.7
$ ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/platform.py platform.py

Ответ 3

Решение, которое я разработал, состояло в том, чтобы дополнить virtualenv.py, чтобы он не только копировал по двоичному файлу Python в новую среду, но также сопровождал файлы libpythonX.Y.so разделяемой библиотеки. Без них крошечная бинарная Anaconda Python (взгляните на нее - это всего лишь несколько килобайт) свяжется с системным libpython, а не с Anaconda libpython, и поэтому у вас есть строка версии Pythons, которая обрабатывается мутантом Anaconda platform.py код.

Вот короткая оболочка script, которая исправит virtualenv.py; запустите его, как только вы активируете среду Anaconda, и запустите pip install virtualenv, чтобы сделать инструмент virtualenv доступным внутри него:

https://github.com/brandon-rhodes/homedir/blob/master/bin/%2Cfix-virtualenv-for-anaconda