Viralenv ——无站点软件包和 pip 仍然在寻找全局软件包?

我原以为 virtualenv --no-site-packages会创建一个完全独立的 Python 环境,但实际上并非如此。

例如,我在全球范围内安装了 python-Django,但希望创建一个带有不同 Django 版本的 viralenv。

$ 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的工作原理?

115854 次浏览

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

最后我发现,不管什么原因,pip-E 不起作用。然而,如果我真的激活了 viralenv,并使用 viralenv 提供的 easy _ install 来安装 pip,然后直接从内部使用 pip,那么它看起来就像预期的那样工作,并且只显示了 viralenv 中的包

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

在运行 pip freeze之前,不要忘记使用 激活虚拟世界(source bin/activate)。否则,您将得到所有全局包的列表。

我遇到过类似的问题,直到我意识到(早在我发现 viralenv 之前) ,我已经在我的。Bashrc 文件。因为事情已经过去一年多了,我没有马上想到这一点。

如果直接以 script.py的形式调用脚本,然后使用 Windows 默认的 opener 并在虚拟环境之外打开 Python,那么在 Windows 上可能会发生类似的问题。使用 python script.py调用它将在虚拟环境中使用 Python。

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

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


一切似乎都很好,接受激活 virtualenv(foo)。它所做的就是允许我们拥有多个(和可变的) Python 环境,例如不同的 Python 版本,或者不同的 Django 版本,或者任何其他的 Python 包——如果我们在生产环境中有一个以前的版本,并且想要用我们的应用程序测试最新的 Django 版本的话。

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

$ pip install django将把它安装到全局站点包中,同样地,获得 pip freeze将给出全局站点包的名称。

而在 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 安装/包没有影响。

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

env/bin/pip freeze

参见测试:

我们使用 --no-site-packages选项创建 viralenv:

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

我们检查新创建的 pipfreeze输出:

$ 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

我也有同样的问题。我(在 Ubuntu 上)遇到的问题是我的路径名包含 $。当我在 $dir 之外创建一个 Virtual alenv 时,它工作得很好。

真奇怪。

Viralenv pip 无法工作的一个可能原因是,如果父文件夹的名称中有 /Documents/project name/app空间 将其重命名为 /Documents/projectName/app可以解决这个问题。

以下列方式暂时清除 PYTHONPATH:

export PYTHONPATH=

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

virtualenv foo
. foo/bin/activate

只有这样:

pip freeze

我遇到了同样的问题,在 venv 的 pip 仍然作为 global pip 工作。
在搜索了很多页之后,我发现了这个方法。
1. 使用选项“—— no-site-package”创建一个新的 venv

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

请注意,虽然“—— no-site-package”选项在 viralenv 的 doc 文件中的1.7.0版本中是默认的,但是我发现它不能工作,除非你手动设置它。为了得到一个纯静脉血,我强烈建议打开这个选项 2. 激活你创建的新环境

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

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

我的问题是 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 发生这个问题是因为我的 python 在 ubuntu 中的默认版本是2.7。通过使用上面的命令,它会忽略默认版本。

根据 python.org 上的文档,对于那些升级到 ubuntu 22.04或者被同样的问题困惑的人,首先删除已安装的 pip,然后将 pip 重新安装到/usr/local/bin,当时间是3.10.5,运行:

sudo python get-pip.py --prefix=/usr/

你需要下载脚本,如果你没有一个。在成功返回消息之后,安装 viralenv 或诗歌,它会注意到/usr/local 是不可写的,并将安装到 ~/。本地的,随便什么地方,没问题。然后一切都准备就绪,使用 viralenv 在您的项目目录中重新创建 venv 文件夹。 如果有任何奇怪的事情发生,使用哪个命令检查 pip3或 viralenv 的路径,并删除它们。