151

我的印象是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

13 回答 13

119

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

于 2013-04-08T19:46:09.957 回答
31

您必须确保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.

于 2015-10-27T11:25:36.997 回答
24

最终我发现,无论出于何种原因, pip -E 都不起作用。但是,如果我真的激活了virtualenv,并使用virtualenv提供的easy_install来安装pip,然后直接从内部使用pip,它似乎可以按预期工作并且只显示virtualenv中的包

于 2009-09-09T20:57:04.910 回答
20

暂时清除PYTHONPATH与:

export PYTHONPATH=

然后创建并激活虚拟环境:

virtualenv foo
. foo/bin/activate

只有这样:

pip freeze
于 2017-10-27T17:02:57.393 回答
19

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

在运行之前不要忘记激活 virtualenv ( ) 。否则,您将获得所有全局包的列表。source bin/activatepip freeze

于 2013-03-02T20:06:48.577 回答
16

--no-site-packages顾名思义,应该从sys.path. 任何其他存在于标准 Python 路径中的东西都将保留在那里。

于 2009-09-05T10:47:29.790 回答
5

如果您直接调用脚本script.py,然后使用 Windows 默认打开器并在虚拟环境之外打开 Python,则在 Windows 上可能会出现类似问题。调用它python script.py会将 Python 与虚拟环境一起使用。

于 2013-10-24T01:55:56.927 回答
2

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

于 2015-06-19T13:33:11.103 回答
1

我遇到了同样的问题。我(在 Ubuntu 上)的问题是我的路径名包含$. 当我在 $ 目录之外创建一个 virtualenv 时,它运行良好。

诡异的。

于 2015-11-22T03:42:06.097 回答
1

virtualenv pip 不起作用的可能原因之一是,如果任何父文件夹的名称中有空格,/Documents/project name/app 则重命名它以/Documents/projectName/app解决问题。

于 2017-05-04T22:18:36.687 回答
0

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

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

请注意,虽然“--no-site-packages”选项自 1.7.0 以来在 virtualenv 的 doc 文件中默认为 true,但我发现它不起作用,除非您手动设置它。为了得到一个纯 venv,我强烈建议打开这个选项 2. 激活你创建的新 env

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

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

于 2019-08-09T03:21:07.470 回答
0

我的问题是pippython3版本。对于最新版本的django安装,pip3是必须的。因此,在使用以下命令创建虚拟环境后,我的问题得到了解决:

> virtualenv --python=python3 venv
> source venv/bin/activate
> which pip3 #should be different from /usr/local/bin/pip3
...<some-directory>/venv/bin/pip3

PS出现这个问题是因为我在ubuntu中的python默认版本是2.7。通过使用上述命令,它将忽略默认版本。

于 2020-08-01T11:06:52.350 回答
0

这是所有 pip 安装选项的列表- 我没有找到任何 ' -E' 选项,可能是旧版本有它。下面我virtualenv为即将到来的 SO 用户分享一个简单的英语用法和工作。


一切似乎都很好,接受激活virtualenv( foo)。它所做的只是允许我们拥有多个(和不同的)python 环境,即各种 Python 版本,或各种 Django 版本,或任何其他 Python 包 - 以防我们在生产中有以前的版本并想用我们的测试最新的 Django 版本应用。

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

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

而在 venv dir (foo) 内部执行$ source /bin/activate将激活 venv,即现在使用 pip 安装的任何东西都只会安装在虚拟环境中,只有现在 pip freeze 不会给出全局站点包 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 安装/包没有影响。

于 2015-10-20T18:26:34.280 回答