Python应用程序经常使用标准库之外的包和模块。有时应用程序需要特定版本的库,因为应用程序可能要求某个特定的bug已经被修复,或者应用程序可能使用过时版本的库接口编写。这意味着一个Python安装不可能满足每个应用程序的需求。如果应用程序A需要某个模块的1.0版本,而应用程序B需要2.0版本,那么这两个需求是冲突的,安装1.0或2.0版本都会导致一个应用程序无法运行。这个问题的解决方案是创建一个虚拟环境,这是一个自包含的目录树,其中包含针对特定版本Python的Python安装,以及一些额外的包。不同的应用程序可以使用不同的虚拟环境。为了解决前面需求冲突的例子,应用程序A可以有自己的虚拟环境,安装版本1.0,而应用程序B有另一个虚拟环境,安装版本2.0。如果应用程序B需要将库升级到版本3.0,这不会影响应用程序a的环境。
用于创建和管理虚拟环境的模块称为venv
。venv
通常会安装最新版本的Python。如果您的系统上有多个版本的Python,您可以通过运行python3或任何您想要的版本来选择一个特定的Python版本。
要创建一个虚拟环境,决定你想要放置它的目录,并以脚本的形式运行venv模块和目录路径:
python3 -m venv tutorial-env
这将创建tutorial-env
目录(如果它不存在的话),并在其中创建包含Python解释器副本和各种支持文件的目录。
虚拟环境的常用目录位置是.venv
。这个名称通常将目录隐藏在您的shell中,因此不碍事,同时给它一个解释目录存在原因的名称。它还防止与某些工具支持的.env
环境变量定义文件发生冲突。
一旦创建了虚拟环境,就可以激活它。
在Windows上,运行:
tutorial-env\Scripts\activate.bat
在Unix或MacOS上,执行:
source tutorial-env/bin/activate
(此脚本是为bash shell编写的。如果你使用csh或fish,则应该用activate.csh
和activate.fish
替代)
激活虚拟环境将改变shell的提示符,以显示正在使用的虚拟环境,并修改环境,以便运行python将获得特定版本和安装的python。例如:
$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>
要停用虚拟环境,在终端输入:
deactivate
您可以使用名为pip的程序安装、升级和删除包。默认情况下,pip将从Python包索引https://pypi.org安装包。您可以通过在web浏览器中访问Python包索引来浏览它。
pip有许多子命令:" install
“、” uninstall
“、” freeze
"等(参见安装Python模块指南获取pip的完整文档)。
您可以通过指定包的名称来安装包的最新版本:
(tutorial-env) $ python -m pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
你也可以通过在包名后面加上==
和版本号来安装一个特定版本的包:
(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
如果您重新运行此命令,pip将注意到所请求的版本已经安装,并且不做任何事情。你可以提供一个不同的版本号来获取该版本,或者你可以运行python -m pip install —upgrade
将包升级到最新版本:
(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
python -m pip uninstall
后跟一个或多个包名将从虚拟环境中删除包。
python -m pip show
将显示关于特定包的信息:
(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
python -m pip list
将显示虚拟环境中安装的所有包:
(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
python -m pip freeze
将生成已安装包的类似列表,但输出使用python -m pip install
期望的格式。一个常见的惯例是把这个列表放在一个requirements.txt
文件中:
(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
然后,可以将requirements.txt提交给版本控制,并作为应用程序的一部分发布。用户可以使用install -r
安装所有必要的包:
(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
...
Installing collected packages: novas, numpy, requests
Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0