Зачем распространять и устанавливать pip на мой virtualenv./local/bin?

Я создаю и активирую virtualenv (venv), используя для этого встроенный в Python 3.3 способ:

$ python3.3 -m venv env
$ source env/bin/activate

С этой точки зрения python это питон в моем virtualenv, который я ожидаю:

(env) $ which python
/my_home_directory/env/bin/python

Теперь я хочу установить дистрибутив и pip, поэтому я загружаю сценарии установки и запускаю их:

(env)$ wget http://python-distribute.org/distribute_setup.py
(env)$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
(env)$ python distribute_setup.py
(env)$ python get-pip.py

Эти команды завершены успешно. На этом этапе я проверяю свой venv, чтобы найти другой каталог под названием "local", которого там не было раньше. env / local / bin содержит мои исполняемые файлы easy_install и pip, и они все еще имеют псевдоним для существующих в моей системе easy_install и pip:

(env)$ ls env
bin  include  lib  local  pyvenv.cfg
(env)$ ls env/bin
activate  pydoc  python  python3  python3.3
(env)$ ls env/local/bin
easy_install  easy_install-3.3  pip  pip-3.3
(env)$ which easy_install
/usr/bin/easy_install
(env)$ which pip
/usr/bin/pip

Я считаю, что это отклонение от поведения Python 2.x. На данный момент я ожидаю easy_install а также pip использование копий virtualenv и использование их для установки яиц поместит их в virtualenv.

Пройдя немного дальше, я открываю env / bin / activ и обнаружив, что env / bin добавляется к системному пути, а env / local / bin - нет. Это объясняет поведение, которое я вижу. Я могу обойти эту проблему, отредактировав env / bin / activ для добавления каталога env / local / bin в путь, что-то вроде:

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
PATH="$VIRTUAL_ENV/local/bin:$PATH"  # my new line
export PATH

Итак, что здесь происходит? Это ошибка, или я что-то упустил?

Я на Ubuntu 12.10 на случай, если что-то изменится.

3 ответа

Решение

У меня есть ощущение, что есть ошибка в пакетах Python Ubuntu или где-то распространять... но я не отследил ее (и я не уверен, что мне все равно).

По какой-то причине переменная окружения VIRTUAL_ENV должна быть установлена ​​в корне virtualenv для правильного распределения и pip.

Эта суть, взятая из примера кода Vinay Sajip в документации по Python 3, устанавливает указанную переменную; оба дистрибутива и pip будут правильно установлены при его использовании.

Это в документации по питону.

"/usr/local" является exec_prefix по умолчанию. Прочтите документацию по venv, чтобы узнать, как изменить поведение по умолчанию. Там даже есть пример, который показывает, как сделать venv.EnvBuilder который устанавливает распространять и пип для вас.

если вы найдете распространяемые документы, пожалуйста, дайте мне знать;-)

У меня такая же проблема. В activate файл сценария, который мне нужно добавить в качестве первой строки (конечно после #!...):

 unset PYTHON_PATH
Другие вопросы по тегам