Virtualenv не включает pip

Я пытаюсь создать виртуальную среду с помощью virtualenv в Mac OS X El Capitan. Я установил Python 2.7.11 с brew, который включает в себя pip, wheel и setuptools по умолчанию.

Hovewer, когда я пытаюсь установить virtualenv следующие инструкции в документации или из любого другого ресурса, я получаю несколько проблем:

  • virtualenv исполняемый файл не помещается в /usr/local/bin после того, как pip выполняет свою работу, поэтому мне нужно ln -s его вручную (это может указывать на то, что на этом шаге что-то не так).
  • После запуска virtualenv venv он создает новую среду, улавливает Python 2.7.11 из brew -installation, но: внутри bin нет папки pip. Это означает, что если я попробую which pip, активировав venv, он вернет глобальную позицию pip - /usr/local/bin/pip, а не /path/to/venv/bin/pip.

Как следствие, установка пакетов внутри venv использует глобальный pip и устанавливает их в глобальный sites-packages, а не внутри venv, и это совершенно противоположно тому, что должна делать среда.

Не могли бы вы предложить, что может быть неправильным и как его исправить?

EDIT: Следует упомянуть, что у меня были другие версии Python, установленные на моем компьютере, которые я недавно удалил, как описано в этом ответе., Возможно, это вызывает проблему, и требуется более тщательная очистка.

Ответ 1

Попробуйте удалить или переименовать файл .pydistutils.cfg в своем домашнем каталоге, например. переименованием с помощью mv ~/.pydistutils.cfg ~/oldpydistutils.cfg

Я размещаю подробный ответ здесь, чтобы помочь другим, но исходный кредит относится к этому ответу. Если вы знаете, что конкретно в .pydistutils.cfg вызвало проблему, дайте мне знать!

У меня была такая же проблема: мои виртуальные среды были созданы без локальной копии pip, хотя у них была локальная копия python. Это означало, что использование $ pip из виртуальной среды, установленной в глобальное местоположение пакета, и не было видимым для среды python.

Как я диагностировал это на своей машине:

  • Я создаю виртуальную среду с помощью $ virtualenv env
  • Активировала виртуальную среду с помощью $ source env/bin/activate
  • Проверено местоположение python: запустите (env)$ which python с выходом /Users/<username>/env/bin/python (как ожидалось)
  • Проверено местоположение точки: запустить (env)$ which pip с выходом /usr/local/bin/pip (НЕ ожидается)

Чтобы проверить, куда идут наши пакеты, мы можем попробовать установить пакет в виртуальной среде:

  1. Попробуйте установить пакет: (env)$ pip install HTTPServer, который преуспевает
  2. Попробуйте запустить пакет: (env)$ python -m HTTPServer, который не работает с ошибкой /Users/emunsing/env/bin/python: No module named HTTPServer
  3. Чтобы дважды проверить, попробуйте установить еще раз: (env)$ pip install HTTPServer, который создает Requirement already satisfied (use --upgrade to upgrade): HTTPServer in /usr/local/lib/python2.7/site-packages

Двойная проверка, мы видим, что в папке среды /bin нет Пипа:

$ ls env/bin activate activate.fish python python2 activate.csh activate_this.py python-config python2.7

И так, пока система находит локальную версию python, она не может найти локальный пип для использования и пересечения $PATH. Он закончил использование pip из /usr/local/bin, в результате чего мне не удалось установить пакеты локально в виртуальную среду.

Вот что я пробовал: - Переустановка python brew uninstall python, за которой следуют brew upgrade и brew install python --build-from-source - Установка pip с помощью команды get-pip.py, как описано в документации по протоколу

Вот что я исключил: - Я не использовал sudo pip ... который вызвал аналогичные проблемы в этом другом вопросе и не делал этого в любое время на этой установке Python/pip - Моя виртуальная среда не показывала локальную установку pip, как это было в случае с подобными вопросами: Этот для Windows, Это для Mac OS X.

В конечном итоге я обнаружил, что устранение файла ~/.pydistutils.cfg устраняет проблему, позволяя создавать новые виртуальные среды, в которых есть свой собственный локальный пип. Содержимое моего файла ~/.pydistutils.cfg:

[global]
verbose=1

[install]
install-scripts=$HOME/bin

[easy_install]
install-scripts=$HOME/bin

Простое переименование файла ~/.pydistutils.cfg устраняет проблему: кажется, что хотя этот файл был создан с помощью установки homebrew, некоторые настройки в этом файле могут быть несовместимым с virtualenv. Хотя удаление этого файла не оказало негативного влияния на мою систему, вам может понадобиться использовать флаг --user при установке пакетов с помощью pip в глобальную среду (например, $ pip install --user HTTPServer). Подробнее подробнее о .pydistutils.cfg, если вы хотите поработать с ним по своему усмотрению.

Ответ 2

  • virtualenv исполняемый файл не помещается в /usr/local/bin после того, как pip выполняет свое задание, поэтому мне нужно ln -s его вручную (это может указывать на то, что на этом шаге что-то не так).

Не делай этого. Это только скроет ошибку и не решит проблему. Вот краткое руководство по отладке таких проблем:

  • Начните с which -a python. Первый путь, который вы видите, должен быть /usr/local/bin/python, если не проверить вашу переменную PATH.

  • Затем проверьте which -a pip. Опять же, первый путь должен быть /usr/local/bin/pip. Если нет, запустите python -m ensurepip и перепроверьте.

  • Теперь установите virtualenv с помощью pip install virtualenv, после чего проверьте вывод which -a virtualenv. Первый путь должен быть /usr/local/bin/virtualenv, если не проверять вывод env |grep PYTHON для непредвиденных переменных среды.

  • Наконец, проверьте вывод virtualenv --version, чтобы убедиться, что у вас установлена ​​последняя версия.

Ответ 3

У меня возникла проблема при запуске virtualenv: "ImportError: Нет модуля с именем pip". Моим решением было понизить достоинство virtualenv. У меня было 16.2.0. pip uninstall virtualenv pip install virtualenv == 15.1.0