我认为virtualenv应该封装并隐藏已安装的所有软件包。但是当我输入
$sudo virtualenv -p /usr/bin/python3 testenv
$source ~/testenv/bin/activate
$sudo pip list
我明白了:
apt-xapian-index (0.45)
argparse (1.2.1)
chardet (2.0.1)
cmsplugin-filer (0.10)
colorama (0.2.5)
command-not-found (0.3)
debtagshw (0.1)
defer (1.0.6)
dirspec (13.10)
...and many more
即使使用--local
参数。 virtualenv被打破了吗?
当我输入:$ which pip
时,我仍然得到:/home/jelikraftuser/testenv/bin/pip
这似乎是正确的。
阅读这篇文章中的答案:pip installing in global site-packages instead of virtualenv
我发现直接用$sudo ~/testenv/bin/pip list
运行pip的建议实际上有效,它只列出了2个包。但是当我运行which pip
时,它会将virtualenv中的pip列为将要运行的pip。
所以我现在有点迷失了。使用完整路径调用pip列表给出了两个包的正确(小)列表,并且在没有完整路径的情况下调用pip列表给了我一个巨大的包列表,这是不正确的。那么,我从哪里开始呢?
当我在没有完整路径的情况下运行pip时,如何让它无法识别全局安装的软件包是否安装在virtualenv中?
好的更新!这有点儿有趣:
(testenv)$ pip --version
pip 1.5.6 from /home/jelikraftuser/testenv/lib/python3.4/site-packages (python 3.4)
(testenv)$ sudo pip --version
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)
当我运行pip作为sudo时,它运行一个,当我以非sudo运行它时,它运行一个不同的点。为什么会这样做?如果我要安装一个软件包,我将以sudo的身份运行它,所以我需要sudo来使用正确的pip。
第二次更新:
阅读此stackoverflow:sudo changes PATH - why? 我发现在ubuntu上你不能改变sudo的路径变量,但这仍然让我感到困惑,因为它之前正在工作......所以我仍然感到困惑。洞察任何人?以前我可以在virtualenv中键入sudo pip list并获得一个近乎空的列表。它对你有同感吗?
编辑3:它还做了什么:
当我运行sudo pip install --download-cache=~/.pip-cache -r piprequirements.txt
时
它说一切都已经安装但是当我输入python时我无法导入它们,但是当我运行python作为sudo时我可以导入它们。因此,超级用户可以看到全局安装的软件包>但是我需要使用sudo来安装包>所以我无法安装已经全局安装的软件包。此外,当我尝试将pip3作为sudo运行时,它会显示sudo: pip3: command not found
。所以这肯定是ubuntu的一个问题,以及运行sudo时环境路径如何变化。是不是所有人都遇到了这个问题呢?我相信很多人都在使用ubuntu,不是吗?