2013-06-23 5 views
3

Это похоже на поврежденное состояние где-то.pip + virtualenv: поврежденное состояние

Во-первых, в virtualenv, pip freeze сообщает, что IPython установлен

% workon myvenv 
(myvenv)% pip freeze | grep ipython 
ipython==0.12.1 

... но ipython видел изнутри virtualenv является не тот, который установлен под virtualenv:

(myvenv)% which ipython 
/usr/bin/ipython 

Действительно, если вы попытаетесь «удалить» копию ipython, установленную под virtualenv, pip откажется так:

(myvenv)% pip uninstall ipython 
Not uninstalling ipython at /usr/lib/python2.7/dist-packages, outside environment /home/yt/.virtualenvs/myvenv 

Он будет также отказаться от установки новой копии:

(myvenv)% pip install ipython 
Requirement already satisfied (use --upgrade to upgrade): ipython in /usr/lib/python2.7/dist-packages 
Cleaning up... 

BTW, копии pip и python видели в virtualenv являются

(myvenv)% which pip 
/home/yt/.virtualenvs/myvenv/bin/pip 
(myvenv)% which python 
/home/yt/.virtualenvs/myvenv/bin/python 

Очевидно, что некоторое состояние испорченный здесь, и я хотел бы выяснить, что. Я подчеркиваю, что меня в первую очередь интересует первый, выясняя, что не так, и только второй, фиксируя его. IOW, меня интересует проблема с устранением неполадок проблема, и не заинтересован в «исправлении» проблемы путем слепых проб и ошибок. По моему опыту, «исправления», возникающие в результате такого слепого путаницы, очевидны, и на самом деле часто делают основной клубок еще хуже.

Мои непосредственные вопросы:

  1. почему pip смотрит на /usr/lib/python2.7/dist-packages даже если virtualenv активен?
  2. Почему pip freeze показать ipython==0.12.1, хотя нет ipython под виртуальный?

ответ

0

Virtualenvs может быть создан с использованием или без пакетов системных сайтов. То есть вы можете выбрать, хотите ли вы видеть вещи, установленные в системе, когда вы находитесь в виртуальном пространстве. Вы должны создать virtualenv, чтобы он мог видеть другие пакеты. Это объясняет, как ваши qustions 1 и 2 - pip видит вашу систему установки IPython.

Если вы установите что-то в virtualenv, он всегда будет использовать это до общесистемной копии. Таким образом, вы можете установить последнюю версию IPython в virtualenv, запустив:

pip install --upgrade ipython 
+0

Спасибо. «... Вы, должно быть, создали virtualenv, чтобы он мог видеть другие пакеты». Не знаете ли вы, где этот параметр конфигурации сохранен? – kjo

+0

Когда вы создаете virtualenv, вы можете использовать флаги '--system-site-packages' или' -no-site-packages'. По умолчанию, чтобы разрешить пакеты системных сайтов, он изменился, чтобы исключить их примерно год назад, я думаю. –

+0

есть также флаг '--ignore-installed', который позволяет вам устанавливать новые пакеты снова, без обновления (полезно для установки' --user' или venv, когда другая версия уже установлена ​​в системном масштабе, Не хочу прикасаться). – minrk