2013-06-23 75 views
3

这看起来像一个损坏的状态某处pip + virtualenv:损坏状态

首先,virtualenv中内,pip freeze报道称,IPython中安装

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

...但是从virtualenv中内看到的ipython的一个的virtualenv下安装:

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

确实,如果有人试图“卸载”在virtualenv下安装的ipython的副本,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... 

顺便说一句,在virtualenv中内看到的pippython的副本

(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,即使virtualenv下没有ipython

回答

0

Virtualenvs既可以带或不带“系统现场包”创建的。即您可以选择当您处于virtualenv中时是否希望能够查看系统中安装的内容。您必须创建virtualenv才能看到其他软件包。这解释了你的问题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