什么是虚拟环境,为什么我应该使用它?

97

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

pip install <name of package>

我遇到了权限错误,不确定原因。虽然我可以使用sudo运行它,但有人告诉我那是个坏主意,我应该使用virtualenv代替。

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


3
请阅读这篇文章:http://flask.pocoo.org/docs/0.12/installation/#virtualenv该文章介绍了如何安装 Flask 应用程序框架,并推荐使用 virtualenv 工具来创建一个独立的 Python 环境。通过这种方式,您可以避免不同应用程序之间可能发生的版本冲突。以下是该文章中的主要步骤:
  1. 安装 virtualenv 工具(如果尚未安装):pip install virtualenv
  2. 创建一个新的虚拟环境:virtualenv myproject
  3. 激活虚拟环境:source myproject/bin/activate
  4. 在虚拟环境中安装 Flask:pip install Flask
  5. 运行 Flask 应用程序:python app.py
  6. 当您完成时,退出虚拟环境:deactivate
希望这能帮助您开始使用 Flask!
- Thanh Nguyen
4个回答

109

如果使用系统自带的Python和库,你只能使用操作系统提供的一个特定版本的Python。试图在一个Python安装中运行所有Python应用程序,可能会导致由于库的集合而产生版本冲突。同时,对系统Python进行更改也可能破坏依赖它的其他操作系统功能。

虚拟环境是轻量级、自包含的Python安装,旨在尽量简单地设置,并且不需要专业知识就可以“立即工作”。

virtualenv避免了全局安装Python包的需要。当虚拟环境激活时,pip 将安装环境内的包,而不会以任何方式影响基本的Python安装。

在Python 3.3或更高版本中,可以按以下方式创建虚拟环境:

$ 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 命令)。

要在您的虚拟环境中工作,您需要激活它:

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

如果您使用的是Windows系统,则可以使用此方法:

$ venv\Scripts\activate

(venv) 在 shell 提示符中可以让你知道哪个虚拟环境被激活了,但如果你不喜欢它,你可以关闭这个功能。你可以运行所有通常的Python命令,它们将局限于你的虚拟环境:

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

python会运行您安装到虚拟环境中的Python版本,因此(例如)您不必键入python3来获取Python 3。运行的Python将可以访问所有标准库模块和您安装到虚拟环境中的所有软件包,但是(默认情况下)无法访问系统范围内site-packages目录中安装的任何软件包。

最后一条规则很重要:通过限制虚拟环境仅使用本地安装的软件包,您可以确保您完全控制项目使用的依赖关系,即使下周某个新的系统范围内的软件包被安装或更新。如果您喜欢,您可以获取已安装软件包的列表:

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

pip 也可以解析这种格式并从中安装软件包,即使在此期间有新版本发布,它仍将安装相同的版本:

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'

你可以创建任意数量的虚拟环境,它们不会相互干扰,也不会影响您的系统包。 虚拟环境只是一个带有一堆二进制文件和脚本的目录,因此您可以像删除任何目录一样删除虚拟环境(在Unix上使用rm -r venv)。如果在删除虚拟环境时虚拟环境已被激活,则可能会混淆您的shell,因此在这种情况下最好先执行deactivate


那么,只有在使用pip安装依赖项或者在虚拟环境中依赖特定版本的Python执行Python代码时,“处于虚拟环境中(即处于活动状态)”才是重要的,对吗?否则,任何其他开发任务都不需要处于虚拟环境中。 - temporary_user_name
在系统Python和库上运行会限制您使用由操作系统提供商选择的特定Python版本,这似乎令人困惑,因为通常操作系统Python版本用于“python -m venv <whatever>”,而像pyenv这样的工具用于管理多个Python版本。 - baxx

8
有时您可能没有root权限,因此可能无法使用sudo。许多其他情况下,不建议使用sudo安装软件包,因为它可能会覆盖某些正在被其他应用程序使用的软件包。 Virtualenv可以帮助您创建一个单独的环境,在这个环境中您不需要root权限,并且可以根据您的需求定制环境。它包含了一个自包含的Python安装程序,只与您创建的特定环境交互。
所以基本上,它给您一点自由,避免损坏(或修改)可能托管许多旧应用程序功能的根环境。
安装也很简单。

8
使用sudo pip安装软件包会全局安装,这可能会破坏一些系统工具。所谓全局安装是指将软件包安装在类似/usr/lib/python2.7/site-package这样的位置,因此,如果某些软件包需要您的Python软件包的先前版本,则此操作可能会破坏它。 virtualenv可以通过创建隔离的Python环境来避免全局安装Python软件包。这意味着它只会在您需要的项目文件夹中安装软件包。
在Mac和Linux上。
  • Install

    python3 -m pip install --user virtualenv
    
  • Creating a Virtual Env: Go to your desired project folder

    python3 -m virtualenv env
    
  • Activating a virtualenv: In your desired project folder

    source env/bin/activate
    

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

如需了解有关在Windows中使用pip的更多信息,请参见: 如何在Windows中使用virtualenv


1

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

什么是虚拟环境?

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

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

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

它对我有什么作用?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接