什么是 virtualenv,我为什么要使用它?

What is a virtualenv, and why should I use one?

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

pip install <name of package>

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

什么是虚拟环境?它对我有什么作用?

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

Virtual environments, or "virtualenvs" 是轻量级的 self-contained Python 安装,旨在以最少的麻烦进行设置,并且 "just work" 不需要大量配置或专业知识.

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 应该是一个 non-existent 目录。该目录可以有任何名称,但为了使这些说明简单,我假设您已经在名为 venv 的目录中创建了您的 virtualenv(例如 python3 -m venv ./venv)。

要在您的 virtualenv 中工作,您需要激活它:

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

或者如果你有 windows 系统,则使用这个:

$ venv\Scripts\activate

shell提示中的(venv)让你知道你激活了哪个virtualenv,但如果你不喜欢可以关闭这个功能。你可以 运行 所有常用的 Python 命令,它们将在你的 virtualenv 本地:

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

python 将 运行 您安装到 virtualenv 中的 Python 版本,因此(例如)您不必键入 python3 即可Python 3. 它 运行 的 Python 将可以访问所有标准库模块和您安装到 virtualenv 中的所有包,但是(默认情况下)none安装在 system-wide site-packages 目录中的软件包数量。

最后一条规则很重要:通过限制你的 virtualenv 只使用 locally-installed 包,你可以确保你准确地控制你的项目正在使用的依赖项,即使一些新的 system-wide 包被获取下周安装或更新。如果愿意,您可以获得已安装软件包的列表:

(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
>>> 

您可以通过停用 virtualenv 来退出它:

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

您可以创建任意数量的 virtualenvs,它们不会相互干扰,也不会干扰您的系统包。一个 virtualenv 是 "just" 一个目录,下面有一堆二进制文件和脚本,所以你可以像删除任何目录一样删除一个 virtualenv(rm -r venv 在 Unix 上)。如果 virtualenv 在你删除它时被激活,你可能会混淆你的 shell,所以在这种情况下最好先 deactivate

有时您没有获得 root 权限,您可能最终无法使用 sudo。很多时候,不建议使用 sudo 来安装包,因为它可能会覆盖一些可能被其他应用程序使用的包。

Virtualenv 可以帮助您创建一个不需要 root 权限的独立环境,并且可以根据您的需要定制环境。它包含 self-contained python 安装,仅与您创建的特定环境交互。

所以基本上,它为您提供了一些自由,并避免损坏(或修改)可能托管旧应用程序的许多旧功能的根环境。

安装也很简单。

使用 sudo pip 安装包将全局安装包,这可能会破坏某些系统工具。

通过全局安装,这意味着您将像 /usr/lib/python2.7/site-package 一样安装您的软件包,因此如果某些软件包需要您的 python 软件包的先前版本,此操作可能会破坏它。

virtualenv 允许您通过创建隔离的 python 环境来 避免 在全局安装 Python 包。这意味着它将只在您想要的项目文件夹中安装包。

在 mac 和 linux

  • 安装

    python3 -m pip install --user virtualenv
    
  • 创建虚拟环境:转到您想要的项目文件夹

    python3 -m virtualenv env
    
  • 激活虚拟环境:在你想要的项目文件夹中

    source env/bin/activate
    

激活后,您可以使用 pip 安装包。

有关在 Windows 中使用它的更多信息: How to use virtualenv in Windows

我要把你的问题分成两部分。

什么是虚拟环境?

Python 有自己的下载、存储和解析站点包的方式。但是Python无法区分site-package目录下的不同版本。软件包将安装在其中一个目录中,其名称可以通过 运行 和 site.getsitepackages() 命令找到。

>>> import site
>>> site.getsitepackages()

这意味着 package_v2.0.1package_v3.0.1 必须在同一个目录中并具有相同的名称,即 package,这显然是不可能的。现在,您可能会问为什么我们的系统需要不同版本的相同包。这是因为多个项目可能需要不同版本的 Python 包,甚至需要不同的 Python 版本本身。所以需要有一些东西来解决这些冲突,Virtualenv 来解决这个问题。

它对我有什么作用?

它隔离了 Python 个项目的环境,以便每个项目都可以有自己的依赖项。