virtualenv --no-site-packages和pip仍在查找全局软件包吗?


136

我印象中virtualenv --no-site-packages会创建一个完全独立和隔离的Python环境,但事实并非如此。

例如,我在全局安装了python-django,但希望使用其他Django版本创建virtualenv。

$ 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。另外,如果我告诉pip冻结环境,则会得到很多软件包。我希望对于一个新鲜的环境来说--no-site-packages这是空白?

$ 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 ...

我是否误解了--no-site-packages应该如何工作?


4
仅供参考,-不推荐使用任何现场包装看到这里
Salem Ben Mabrouk

@SalemBenMabrouk链接断开,新链接在这里。Github上的相关问题:“ --no-site-packages”标志最近消失了吗?
Ynjxsjmh

在该链接中,它说 --no-site-packages已弃用。保留只是为了向后兼容。能够访问全球站点包是现在的默认行为。如果要访问全局站点包,则可以启用--system-site-packages
Ynjxsjmh

Answers:


107

我遇到了这样的问题,直到意识到(早于发现virtualenv),我就开始在.bashrc文件中的PYTHONPATH中添加目录。由于已经过去一年多了,所以我没有马上想到。


12
我的英雄!如果您只是想很快检查那是否是您的问题,可以运行printenv来查看PYTHONPATH是否存在,如果存在,请运行未设置的PYTHONPATH。如果您不想再出现此问题,则仍然必须查找问题,但这将使您在当前的shell会话中获得全新的virtualenv设置。
UltraBob 2014年

自制也这样做!
罗布2014年

1
希望我能再投票给您。遇到由于我的PYTHONPATH已设置而导致的问题后,我已经多次访问此页面。
Bemmu

我知道这是一个非常(确实)古老的帖子,但是我到处搜索,包括在SO上问自己的一些问题,而且我不知道该如何开始--no-site-packages工作。我接近擦ubuntu并查看是否可以解决问题。最初我以为我遇到了相同的PYTHONPATH问题,但是在运行时printenv,我看不到它。沮丧越来越严重,任何帮助将不胜感激。我从用创建的venv内部的sys.path --no-site-packages似乎包括了我的所有软件包目录。我没有最雾的如何修改它。救命?
NotAnAmbiTurner

PATH如果您也从virtualenv外部找到可执行文件,这也可以应用于您的全局变量。
enderland

27

您必须确保pip在创建的虚拟环境中而不是全局环境中运行二进制文件。

env/bin/pip freeze

查看测试:

我们使用以下--no-site-packages选项创建virtualenv :

$ 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

但是,如果我们使用global 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


我有同样的问题。我不知道这是怎么发生的,因为起初调用pip Frozen确实向我显示了正确的软件包,但是几天后它开始调用位于/ usr / local / bin /的
软件包

1
这对我来说是个问题:我已将别名pip指定为全局pip的特定路径,在激活virtualenv时不会被覆盖。
merlinND

1
您刚刚救了我,这对我来说很有效(pip3&python3.7)谢谢
Saed Yousef

24

最终,我发现无论出于什么原因,pip -E都无法正常工作。但是,如果我实际上激活了virtualenv,并使用virtualenv提供的easy_install来安装pip,然后直接从内部使用pip,那么它似乎可以正常工作,并且只显示virtualenv中的软件包。


2
FWIW,使用pip和virtualenv的当前主干版本,您的原始工作流程现在无论如何对我来说都是正确的。也就是说,我个人仍然避免使用-E,而只是在每个virtualenv中安装pip。
卡尔·梅耶

17

我知道这是一个非常老的问题,但是对于那些来到这里寻求解决方案的人来说:

运行之前不要忘记激活virtualenvsource bin/activatepip freeze。否则,您将获得所有全局软件包的列表。


非常感谢您,我知道我必须将源代码与virtualenv一起使用,而不是为virtualenvwrapper使用,而且我从未听说过pip冻结。再次感谢
Deepend

正确答案。在初始化virtualenv之后,您必须将其激活,否则您将使用python的系统版本
AsAP_Sherb


15

--no-site-packages顾名思义,应该从中删除标准site-packages目录sys.path。保留在标准Python路径中的所有其他内容都将保留在那里。


1
对我来说,我的清洗PYTHONPATHexport PYTHONPATH=似乎这样的伎俩。
杜松

4

如果直接调用脚本script.py,则在Windows 上可能会发生类似的问题,因为脚本随后使用Windows默认打开器并在虚拟环境之外打开Python。调用它将python script.py在虚拟环境中使用Python。


脚本顶部应该有一个shebang行(以'!#'开头),该行将指向要使用的解释。
wobbily_col 2015年

2

当您将virtualenv目录移动到另一个目录(在linux上)或重命名父目录时,似乎也会发生这种情况。


1

我遇到了同样的问题。对我来说(在Ubuntu上)的问题是我的路径名包含$。当我在$ dir之外创建一个virtualenv时,它工作正常。

奇怪的。


1

virtualenv pip无法正常工作的可能原因之一是,如果任何父文件夹的名称中都有空格/Documents/project name/app 重命名以/Documents/projectName/app解决该问题。


1

我遇到了同样的问题,即venv中的点仍然可以用作全局点。
搜索很多页面后,我以这种方式解决了。
1.通过virtualenv使用选项“ --no-site-packages”创建一个新的venv

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

请注意,尽管从Virtualenv的doc文件中的1.7.0版本开始,“-no-site-packages”选项默认为true,但是我发现它除非您手动将其设置为不起作用。为了获得纯净的venv,我强烈建议打开2。激活您创建的新env

source ./my_env_name/bin/activate
  1. 检查您的pip位置和python位置,并确保这两个命令在虚拟环境下
pip --version
which python
  1. 在虚拟环境下使用pip安装不受全局软件包中断影响的软件包
pip install package_name

希望这个答案对您有帮助!


0

这是所有pip安装选项的列表-我没有找到任何' -E'选项,可能是较旧的版本。下面,我virtualenv将为即将到来的SO用户提供简单的英语用法和使用方法。


一切似乎都不错,请接受激活virtualenvfoo)。它所要做的就是允许我们拥有多个(和不同的)Python环境,即各种Python版本,各种Django版本或任何其他Python包-如果我们有生产中的先前版本,并且想用我们的测试最新的Django版本应用。

简而言之,创建和使用(激活)虚拟环境(virtualenv)使得可以使用不同的Python解释器(即python 2.7和3.3)运行或测试我们的应用程序或简单的python脚本-可以全新安装(使用--no-site-packages选项),也可以使用现有的所有软件包/ last设置(使用--system-site-packages选项)。要使用它,我们必须激活它:

$ pip install django 将其安装到全局站点程序包中,并类似地获取 pip freeze will会给出全局站点程序包的名称。

而在venv dir(foo)内部执行$ source /bin/activate将激活venv,即,现在使用pip安装的所有内容都只会安装在虚拟env中,并且只有现在pip冻结将不会提供全局站点软件包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)$符号表明我们正在使用虚拟python环境之前,即任何带有pip的东西-安装,冻结,卸载将仅限于该venv,并且对全局/默认Python安装/软件包没有影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.