我正在尝试使用此命令安装 Python 包
pip install <name of package>
我遇到了权限错误,但我不知道为什么。我可以用 sudo
运行它,但有人告诉我这是个坏主意,我应该使用 virtualenv。
什么是虚拟环境?它对我有什么用?
最佳答案
使用系统 Python 和库运行会将您限制为一个特定的 Python 版本,由您的操作系统提供商选择。尝试在一个 Python 安装上运行所有 Python 应用程序很可能会在库集合之间发生版本冲突。对系统 Python 的更改也可能会破坏依赖它的其他操作系统功能。
Virtual environments, or "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
的目录中创建了您的 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 中的所有包,但(默认情况下)没有安装在系统范围的 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
>>>
您可以通过停用它来退出 virtualenv:
(venv)$ deactivate
$ python
[...]
>>> import requests
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'requests'
您可以创建任意数量的虚拟环境,它们不会相互干扰,也不会干扰您的系统包。 virtualenv 是“只是”一个目录,其中包含一堆二进制文件和脚本,因此您可以像删除任何目录一样删除 virtualenv(Unix 上的 rm -r venv
)。如果 virtualenv 在你移除它时被激活,你可能会混淆你的 shell,所以在这种情况下首先 deactivate
可能是个好主意。
关于python - 什么是 virtualenv,我为什么要使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972261/