什么是virtualenv,为什么我要使用一个?

凯文:

我正在尝试使用此命令安装Python软件包

pip install <name of package>

我遇到权限错误,不确定为什么。我可以使用来运行它sudo,但是有人告诉我这是个坏主意,我应该改用virtualenv。

什么是virtualenv?它对我有什么作用?

凯文:

与系统Python和库一起运行会将您限制为OS提供商选择的一个特定Python版本。试图在一个Python安装上运行所有Python应用程序,可能会导致库集合之间发生版本冲突。对系统Python的更改也有可能破坏依赖于它的其他OS功能。

虚拟环境或“ virtualenvs”是轻量级的,自包含的Python安装,旨在以最少的麻烦进行设置,并且无需大量配置或专业知识即可“正常工作”。

virtualenv无需全局安装Python软件包。当virtualenv处于活动状态时,pip将在环境中安装软件包,这不会以任何方式影响基础Python的安装。

在Python 3.3或更高版本中,您可以按以下方式创建virtualenv:

$ python3 -m venv ENV_DIR

对于Windows,您应该替换python3为python.exe的完整路径:

>C:\Python34\python.exe -m venv ENV_DIR

(这是典型的Python安装;您的系统可能有所不同。)

在旧版本的Python(包括Python 2)中,以下命令之一在大多数情况下应该可以运行:

$ virtualenv ENV_DIR
$ venv ENV_DIR
$ pyvenv ENV_DIR
$ pyvenv3 ENV_DIR

ENV_DIR应该是一个不存在的目录。该目录可以具有任何名称,但是为了使这些说明保持简单,我将假定您已在名为venv(例如,带有python3 -m venv ./venv的目录中创建了virtualenv

要在virtualenv中工作,请激活它:

$ . ./venv/bin/activate
(venv)$ 

如果您有Windows系统,请使用以下命令:

$ venv\Scripts\activate

(venv)在shell提示让你知道哪些VIRTUALENV您已经激活了,但你可以打开此功能,如果你不喜欢它。您可以运行所有常用的Python命令,它们将在您的virtualenv本地:

(venv)$ pip install requests numpy
[...]
(venv)$ python
[...]
>>> import requests
>>> import numpy as np
>>> 

python将运行您在virtualenv中安装的Python版本,因此(例如)您无需键入python3即可获取Python3。它运行的Python将可以访问所有标准库模块和所有已安装的软件包。进入virtualenv,但(默认情况下)没有安装在系统级site-packages目录中的所有软件包

这最后一条规则很重要:通过限制virtualenv仅使用本地安装的软件包,即使下周安装或更新了一些新的系统级软件包,也可以确保完全控制项目使用的依赖项。如果愿意,可以获取已安装软件包的列表:

(venv)$ pip freeze
requests==2.13.0
numpy==1.12.0
(venv)$ 

pip 也可以解析此格式并从中进行安装,即使在此期间已发布更新,它也将安装相同的版本:

(venv)$ pip freeze >requirements.txt

(some-other-venv)$ pip install -r requirements.txt
[...]
(some-other-venv)$ python
>>> import requests
>>> import numpy as np
>>> 

您可以通过停用虚拟环境来摆脱它:

(venv)$ deactivate
$ python
[...]
>>> import requests
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'requests'

您可以创建任意数量的virtualenv,它们不会互相干扰,也不会干扰您的系统软件包。virtualenv是“仅”一个目录,在该目录下有一堆二进制文件和脚本,因此您可以通过删除任何目录的相同方式来删除virtualenv(rm -r venv在Unix上)。如果在删除虚拟环境时将其激活,则可能会使您的shell感到困惑,因此deactivate在这种情况下首先使用它可能是一个好主意

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当只有一个实现类时,为什么要使用一个接口?

什么是动态代理类,为什么我要使用一个?

为什么会有Java单例类?您什么时候需要使用一个

我为什么要使用Drools?

为什么我要使用枚举,而不仅仅是一个类?

Flutter:SizedBox与Container,为什么要使用一个而不是另一个?

如果我只能定义一个变量,为什么要使用It.is <>或It.IsAny <>?

我为什么要使用ExpressionVisitor?

如果我使用virtualenv,为什么还要使用流浪汉?

什么是狭窄的原型,为什么我需要一个?

为什么要使用一个空的Xamarin Android应用程序大约10mb的空间?

为什么要使用Koa路由器等待下一个?

为什么只有一个线程时需要使用线程锁定?(蟒蛇)

当我只能定义一个可变长度数组时,为什么要使用malloc()?

为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?

Kephas有自己的可靠注射容器。为什么要使用另一个框架,为什么不使用现有框架呢?

当我可以创建一个简单的has_many / belongs_to时,为什么要使用多态关系?

为什么我需要使用strdup()?

为什么此迭代器需要使用期限,如何给它一个生命期?

为什么我的SKAudioNode给我一个错误?

当卡塔尔分配了800,000个IP地址时,为什么要使用一个IP地址?

什么是“集成脚本”,为什么我要一个?

如果我们已经得到一个随机数组,为什么要使用随机快速排序?

为什么我需要使用chroot

为什么我的CPU仅主要使用一个内核?

如果要使用await,为什么Javascript(ES.next)会强制我将一个函数声明为异步函数?

当我只能通过引用复制另一个方法时,为什么要使用bind()?

为什么有一个/ bin / echo,为什么我要使用它?

了解 Xcode 中的 .xcconfig 文件,我们为什么要使用它。我看到一个用于调试,一个用于发布。