virtualenv --no-site-packages 和 pip 仍在寻找全局包?

Posted

技术标签:

【中文标题】virtualenv --no-site-packages 和 pip 仍在寻找全局包?【英文标题】:virtualenv --no-site-packages and pip still finding global packages? 【发布时间】:2010-11-25 20:35:25 【问题描述】:

我的印象是 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 应该如何工作?

【问题讨论】:

@SalemBenMabrouk 链接断开,new link 在这里。 Github 上的相关问题:Did the '--no-site-packages' flag recently disappear? 在该链接中,它说--no-site-packages 已弃用。保留只是为了向后兼容。 没有访问全局站点包现在是默认行为。如果你想访问全局站点包,你可以启用--system-site-packages 从哪个版本开始弃用,@Ynjxsjmh?我想我们仍然需要明确的--no-site-packages,如果旧版本的 python/virtualenv 可能已经到位? @AaronMcDaid 我没有调查这个,但是我提到的 github issue 的作者说它至少在 20.0.0 中消失了。对于旧版本的 virtualenv,我们仍然需要显式的--no-site-packages 【参考方案1】:

我的问题是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。通过使用上述命令,它将忽略默认版本。

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

virtualenv 默认使用 python2,在 python3 中替换为 venv【参考方案3】:

暂时清除PYTHONPATH

export PYTHONPATH=

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

virtualenv foo
. foo/bin/activate

只有这样:

pip freeze

【讨论】:

通过调用 unset PYTHONPATH 并在之后立即创建 venv 来临时清理 PYTHONPATH 有所帮助。【参考方案4】:

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

【讨论】:

对我来说,用export PYTHONPATH= 清理我的PYTHONPATH 似乎可以解决问题。 使用未设置的 PYTHONPATH 清理 PYTHONPATH 有帮助。之后,调用 python3 -m venv ./venv_dir 应该启动虚拟环境,只是无法识别 --no-site-packages 选项。一旦 venv 被激活,pip freeze 会列出一个干净的虚拟环境的包。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

很奇怪。

【讨论】:

【参考方案7】:

您必须确保在您创建的虚拟环境中运行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.

我们从新创建的pip 中检查freeze 的输出:

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

但如果我们确实使用全局 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 freeze 确实显示了正确的包,但几天后它开始调用位于 /usr/local/bin/ 的包... 这对我来说是个问题:我已将 pip 别名为全局 pip 的特定路径,激活 virtualenv 时该路径未被覆盖。 你刚刚救了我,这对我很有效(pip3 & python3.7)谢谢【参考方案8】:

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


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

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

$ pip install django 会将其安装到全局站点包中,同样获取pip freeze 将给出全局站点包的名称。

在 venv 目录 (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 安装/包没有影响。

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

脚本顶部应该有一个 shebang 行(以 '!#' 开头)将指向要使用的解释。【参考方案11】:

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

【讨论】:

我的英雄!如果您只想快速检查这是否是您的问题,您可以运行 printenv 以查看 PYTHONPATH 是否存在,如果存在,请运行 unset PYTHONPATH。如果您不想再弹出该问题,您仍然需要追查问题,但这会让您在当前 shell 会话中设置一个全新的 virtualenv。 自制软件也这样做! 我希望我能给你更多的支持。在遇到由于我的 PYTHONPATH 已设置的问题后,我不止一次来到此页面。 我知道这是一个非常(非常)旧的帖子,但我到处搜索,包括问我自己关于 SO 的一些问题,但我不知道如何让 --no-site-packages 工作。我快要擦 ubuntu 看看是否能解决问题。我最初以为我遇到了同样的 PYTHONPATH 问题,但是在运行 printenv 时,我看不到它。挫败感正在增加,非常感谢任何帮助。我在使用--no-site-packages 创建的 venv 内部的 sys.path 似乎包含了我所有的包目录。我没有最模糊的如何修改它。帮忙? 如果您也从 virtualenv 之外找到可执行文件,这也可以应用于您的全局 PATH 变量。【参考方案12】:

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

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

【讨论】:

正确答案。初始化 virtualenv 后你必须激活它,否则你将使用系统版本的 python【参考方案13】:

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

【讨论】:

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

以上是关于virtualenv --no-site-packages 和 pip 仍在寻找全局包?的主要内容,如果未能解决你的问题,请参考以下文章

使用 virtualenv / virtualenvwrapper 在特定目录中创建 virtualenv [重复]

python三大神器之virtualenv

python virtualenv

python virtualenv

Python 虚拟环境 virtualenv

virtualenv(for python)