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】:
我的问题是pip
和python3
版本。对于最新版本的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 仍在寻找全局包?的主要内容,如果未能解决你的问题,请参考以下文章