当前位置: 首页 > 面试题库 >

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

范云
2023-03-14
问题内容

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

pip install <name of package>

我收到权限错误,不确定为什么。我可以使用来运行它sudo,但是有人告诉我这是个坏主意,我应该改用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(rm -r venv在Unix上)。如果在删除虚拟环境时将其激活,则可能会使您的shell感到困惑,因此deactivate在这种情况下先进行操作可能是一个好主意。



 类似资料:
  • 问题内容: 使用动态代理的用例是什么? 它们与字节码生成和反射有何关系? 有什么推荐的读物吗? 问题答案: 我强烈推荐此资源。 首先,您必须了解什么是代理模式用例。请记住,代理的主要目的是控制对目标对象的访问,而不是增强目标对象的功能。访问控制包括同步,身份验证,远程访问(RPC),惰性实例化(休眠,Mybatis),AOP(事务)。 与静态代理相反,动态代理生成在运行时需要Java反射的字节码。

  • 问题内容: serialVersionUID缺少a时,Eclipse发出警告。 问题答案: 首先,我需要解释什么是序列化。 序列化 允许将对象转换为流,以便通过网络发送该对象,或者保存到文件或保存到DB以供使用。 有一些序列化规则。 仅当对象的类或其超类实现接口时,该对象才可序列化 一个对象是可序列化的(本身实现了接口),即使其超类不是。但是,可序列化类的层次结构中的第一个超类(不实现Serial

  • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这

  • 为什么要用 this? 如果对于那些老练的 JavaScript 开发者来说 this 机制都是如此的令人费解,那么有人会问为什么这种机制会有用?它带来的麻烦不是比好处多吗?在讲解 如何 有用之前,我们应当先来看看 为什么 有用。 让我们试着展示一下 this 的动机和用途: function identify() { return this.name.toUpperCase(); } f

  • 问题内容: 我有一个将对象保存到数据库的EJB。在我看到的一个示例中,一旦保存了此数据(EntityManager.persist),就会调用EntityManager.flush();。为什么我需要这样做?我要保存的对象未附加,以后在该方法中也不会使用。实际上,一旦保存,该方法就会返回,并且我希望资源会被释放。(示例代码也在remove调用上执行此操作。) 问题答案: 调用将强制数据立即被持久保

  • 问题内容: 什么是Unix时间戳?在PHP中,使用日期时,该函数输出一些整数值- 那是什么?我尝试了解这一点,但无法获得满意的答案,尤其是为什么我们需要使用转换日期。 问题答案: 什么是Unix时间戳 简而言之,Unix时间戳是一种跟踪时间(以秒为单位)的方式。此计数从1970年1月1日UTC的Unix Epoch开始。因此, Unix时间戳仅仅是特定日期和Unix Epoch之间的秒数 。还应该