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

时间:2009-09-05 09:59:17

标签: python virtualenv pip

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

13 个答案:

答案 0 :(得分:100)

我遇到了这样的问题,直到我意识到(早在我发现virtualenv之前),我就已经在我的.bashrc文件中将目录添加到PYTHONPATH了。由于事先已经超过一年,我没有立刻想到这一点。

答案 1 :(得分:23)

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

答案 2 :(得分:20)

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

但如果我们使用全球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

答案 3 :(得分:16)

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

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

答案 4 :(得分:14)

顾名思义,

--no-site-packages应该从sys.path中删除标准的site-packages目录。生活在标准Python路径中的任何其他内容都将保留在那里。

答案 5 :(得分:12)

暂时清除PYTHONPATH

export PYTHONPATH=

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

virtualenv foo
. foo/bin/activate

只有这样:

pip freeze

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

return ""

请注意,尽管virtualenv的doc文件中的“ --no-site-packages”选项从1.7.0开始默认为true,但是我发现它不起作用,除非您手动设置它。为了获得纯静脉,我强烈建议打开此选项 2.激活您创建的新环境

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

希望此答案对您有帮助!

答案 10 :(得分:0)

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

每件事似乎都很好,接受激活virtualenvfoo)。所有这一切都是允许我们拥有多个(和变化的)python环境,即各种Python版本,或各种Django版本,或任何其他Python包 - 如果我们有一个以前的版本正在生产,并希望测试最新的Django版本与我们应用。

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

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

虽然在venv dir(foo)中执行$ source /bin/activate将激活venv,即现在安装pip的任何东西都只会安装在虚拟环境中,而且现在只有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没有影响安装/包。

答案 11 :(得分:0)

我遇到了同样的问题。我(在Ubuntu上)的问题是我的路径名包含$。当我在$ dir之外创建virtualenv时,它运行正常。

怪异。

答案 12 :(得分:0)

我的问题是<form method="post" id="addStaffForm" data-toggle="validator"> <div class="modal-body"> @csrf @method('POST') <input type="text" name="id" id="id"> <div class="form-group"> <label>{{__('Staff Name')}}</label> <input type="text" class="form-control" id="name" name="name" required autofocus> </div> <div class="form-group"> <label>{{__('Email Address')}} </label> <input required id="email" type="email" class="form-control " name="email"> </div> <div class="form-group"> <label >{{__('Password')}} </label> <input required value="12345678" readonly id="password" type="password" class="form-control" name="password"> <span class="text-info" role="alert"><strong>{{__('Default Password 12345678')}}</strong></span> </div> <div class="form-group"> <label>{{__('Confirm Password')}} </label> <input readonly type="password" id="confirm_password" class="form-control" name="password_confirmation" value="12345678" required> </div> <div class="form-group"> <label>{{ __('Position') }} </label> <select required id="role_id" type="select" class="form-control" name="role_id"> @if($roles->count() > 0) @foreach ($roles as $role) <option value="{{$role->id}}">{{$role->role_name}}</option> @endforeach @endif </select> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="submit" id="insertBtn" class="btn btn-info"></button> </div> </form> pip版本。对于最新版本的python3安装,需要django。因此,使用以下命令创建虚拟环境后,我的问题得以解决:

pip3

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