什么是 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.1
和 package_v3.0.1
必须在同一个目录中并具有相同的名称,即 package
,这显然是不可能的。现在,您可能会问为什么我们的系统需要不同版本的相同包。这是因为多个项目可能需要不同版本的 Python 包,甚至需要不同的 Python 版本本身。所以需要有一些东西来解决这些冲突,Virtualenv
来解决这个问题。
它对我有什么作用?
它隔离了 Python 个项目的环境,以便每个项目都可以有自己的依赖项。
我正在尝试使用此命令安装 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.1
和 package_v3.0.1
必须在同一个目录中并具有相同的名称,即 package
,这显然是不可能的。现在,您可能会问为什么我们的系统需要不同版本的相同包。这是因为多个项目可能需要不同版本的 Python 包,甚至需要不同的 Python 版本本身。所以需要有一些东西来解决这些冲突,Virtualenv
来解决这个问题。
它对我有什么作用?
它隔离了 Python 个项目的环境,以便每个项目都可以有自己的依赖项。