2009-09-05 4 views
104

У меня создалось впечатление, что virtualenv --no-site-packages создадут полностью отдельную изолированную среду Python, но это не похоже.virtualenv --no-site-packages и pip все еще находят глобальные пакеты?

Например, у меня есть python-django, установленный глобально, но вы хотите создать virtualenv с другой версией Django.

$ virtualenv --no-site-packages foo  
New python executable in foo/bin/python 
Installing setuptools............done. 
$ pip -E foo install Django 
Requirement already satisfied: Django in /usr/share/pyshared 
Installing collected packages: Django 
Successfully installed Django 

Из того, что я могу сказать, выше pip -E foo install предполагается повторно установить новую версию Django. Кроме того, если я расскажу о том, что для замораживания среды, я получаю множество пакетов. Я бы ожидал, что для новой среды с -no-site-пакетами это будет пустым?

$ pip -E foo freeze 
4Suite-XML==1.0.2 
BeautifulSoup==3.1.0.1 
Brlapi==0.5.3 
BzrTools==1.17.0 
Django==1.1 
... and so on ... 

Я не понимаю, как - не-сайт-пакеты должны работать?

ответ

13

--no-site-packages следует, как следует из названия, удалить стандартный каталог сайтов-пакетов из sys.path. Все остальное, что живет на стандартном пути Python, останется там.

+0

Для меня очистки мой '' PYTHONPATH' с экспортом PYTHONPATH = 'казалось, сделал трюк. –

23

В конце концов я обнаружил, что по какой-то причине pip -E не работал. Однако, если я фактически активирую virtualenv и использую easy_install, предоставленный virtualenv для установки pip, то используйте pip напрямую изнутри, он работает как ожидалось и только показывает пакеты в virtualenv

+1

FWIW, с текущими версиями соединительных линий pip и virtualenv, ваш исходный рабочий процесс теперь делает все правильно, для меня в любом случае. Тем не менее, я лично все еще избегаю -E и просто устанавливаю pip в каждом virtualenv. –

15

Я знаю, что это очень старый вопрос, но для тех, кто прибывает сюда в поисках решения:

не забудьте активировать virtualenv (source bin/activate) перед запуском pip freeze. В противном случае вы получите список всех глобальных пакетов.

+0

Огромное вам спасибо за это, я знал, что должен использовать источник с virtualenv, но не для virtualenvwrapper, и я никогда не слышал о замораживании контура. Еще раз спасибо – Deepend

+0

ПРАВИЛЬНЫЙ ОТВЕТ. после инициализации virtualenv вы должны активировать его или вы будете использовать системную версию python –

89

У меня была такая проблема, пока я не понял, что (задолго до того, как я открыл virtualenv), я отправил каталоги в PYTHONPATH в мой .bashrc-файл. Как это было год назад, я сразу об этом не думал.

+1

Это была моя проблема. Благодарю. – UXkQEZ7

+10

Мой герой! Если вы просто хотите проверить, действительно ли это ваша проблема, вы можете запустить printenv, чтобы увидеть, существует ли PYTHONPATH, и если это так, запустите unset PYTHONPATH. Вам все равно придется отследить проблему, если вы больше не хотите, чтобы проблема всплывала, но это позволит вам получить новый виртуальный скрипт, установленный в текущем сеансе оболочки. – UltraBob

+0

Homebrew делает это тоже! – Rob

3

Аналогичная проблема может возникнуть в Windows, если вы вызываете скрипты непосредственно как script.py, который затем использует открыватель по умолчанию Windows и открывает Python вне виртуальной среды. Вызов с python script.py будет использовать Python с виртуальной средой.

+0

В верхней части скрипта должна быть строка shebang (начиная с '! #'), Которая укажет на интерпретируемый, который будет использоваться e. –

2

Это также происходит, когда вы перемещаете каталог virtualenv в другой каталог (в linux) или переименовываете родительский каталог.

0

Вот список всех пунктов установки options - Не найдено ни одной опции «-E», возможно, она была более старой. Ниже я расскажу об использовании английского языка и работе virtualenv для будущих пользователей SO.


Каждая вещь кажется, хорошо, примите активируя virtualenv (foo). Все, что он делает, это позволить нам иметь множественную (и меняющуюся) среду python, то есть различные версии Python или различные версии Django, или любой другой пакет Python - если у нас есть предыдущая версия на производстве и мы хотим протестировать последнюю версию Django с нашей заявление.

Вкратце создание и использование (активации) виртуальной среды (virtualenv) позволяет запускать или тестировать наше приложение или простые скрипты python с помощью другого интерпретатора Python, то есть Python 2.7 и 3.3 - может быть новая установка (с использованием опции --no-site-packages) или всех пакетов из существующей/последней настройки (с использованием опции --system-site-packages). Чтобы использовать его, мы должны его активировать:

$ pip install django установит его в глобальные пакеты сайтов, и аналогичным образом получение pip freeze даст имена глобальных пакетов сайтов.

В то время как внутри venv dir (foo) выполнение $ source /bin/activate активирует venv, то есть теперь все, что установлено с помощью pip, будет установлено только в виртуальном env, и только теперь задержка цикла не даст список пакетов пакетов python для пакетов на сайте , После активации:

$ virtualenv --no-site-packages foo  
New python executable in foo/bin/python 
Installing setuptools............done. 
$ cd foo 
$ source bin/activate 
(foo)$ pip install django 

(foo) перед $ знак указывает, что мы используем виртуальную среду питона т.е. любая вещь с пип - установить, замораживать, деинсталляция будет ограничено этим venv, и не оказывает влияния на глобальную установку Python/по умолчанию/пакеты.

14

Вы должны убедиться, что вы используете двоичный файл pip в созданной вами виртуальной среде, а не глобальную.

env/bin/pip freeze 

Смотрите тест:

Мы создаем virtualenv с опцией --no-site-packages:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest 
Running virtualenv with interpreter /usr/local/bin/python 
New python executable in mytest/bin/python 
Installing setuptools, pip, wheel...done. 

Мы проверяем выход freeze из вновь созданного pip:

$ mytest/bin/pip freeze 
argparse==1.3.0 
wheel==0.24.0 

Но если мы используем глобальную pip, это то, что мы получаем:

$ pip freeze 
... 
pyxdg==0.25 
... 
range==1.0.0 
... 
virtualenv==13.1.2 

То есть, все пакеты, которые pip уже установлены во всей системе. Проверяя which pip, мы получаем (по крайней мере, в моем случае) что-то вроде /usr/local/bin/pip, что означает, что когда мы делаем pip freeze, он вызывает этот двоичный код вместо mytest/bin/pip.

+0

У меня была такая же проблема. Интересно, как это произошло, так как сперва вызыв из-за зависания на пике показал мне правильные пакеты, но через пару дней он начал называть тот, который находится в/usr/local/bin/... – jimijazz

+1

Это была проблема для меня : Я использовал псевдоним 'pip' для определенного пути к глобальному пипу, который не был переопределен при активации virtualenv. – merlinND

0

У меня была такая же проблема. Проблема для меня (на Ubuntu) заключалась в том, что мой путь содержал $. Когда я создал virtualenv вне $ dir, он работал нормально.

Странно.

1

Одна из возможных причин, по которым virtualenv pip не будет работать, - если какая-либо из родительских папок имела место в своем имени /Documents/project name/app , переименование его на /Documents/projectName/app решает проблему.

6

Можжевельник получил ответ.

Очистить PYTHONPATH с:

export PYTHONPATH= 

Затем создать и активировать виртуальную среду:

virtualenv foo 
. foo/bin/activate 

Только тогда:

pip freeze 
+0

export PYTHONPATH = работал для меня, спасибо – mirhossein

 Смежные вопросы

  • Нет связанных вопросов^_^