介绍
Python应用程序通常会使用非标准库的包和模块。 应用程序有时需要库的特定版本,因为应用程序可能需要修复某个特定的错误,或者应用程序可能使用库的接口的过时版本编写。
这意味着一个Python安装可能无法满足每个应用程序的要求。 如果应用程序A需要特定模块的版本1.0,但应用程序B需要版本2.0,那么需求是冲突的,安装版本1.0或2.0将使一个应用程序无法运行。
此问题的解决方案是创建一个虚拟环境,一个自包含的目录树,其中包含特定版本的Python的Python安装以及一些附加包。
不同的应用程序可以使用不同的虚拟环境 要解决较早的冲突需求示例,应用程序A可以拥有自己的安装了版本1.0的虚拟环境,而应用程序B拥有另一个2.0版本的虚拟环境。 如果应用程序B要求将库升级到版本3.0,则这不会影响应用程序A的环境。
创建虚拟环境
用于创建和管理虚拟环境的模块称为venv(Virtual Environments)。 venv通常会安装您可用的最新版本的Python。 如果您的系统上有多个Python版本,您可以通过运行python3或您想要的任何版本来选择特定的Python版本。
要创建虚拟环境,请决定要放置它的目录,然后将venv模块作为脚本运行,并使用目录路径:
python3 -m venv tutorial -env
这将创建tutorial-env目录(如果它不存在),并且还会在其中创建包含Python解释程序副本,标准库和各种支持文件的目录。
一旦你创建了一个虚拟环境,你可以激活它。
# on windows, run:
tutorial-env\Scripts\activate.bat
# on Unix or MacOS, run:
source tutorial-env/bin/activate
(这个脚本是为bash shell编写的,如果你使用csh或者fish shell,你可以使用替代的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']
>>>
用pip管理包
您可以使用名为pip的程序来安装install,升级upgrade和删除remove软件包。 默认情况下,pip将从Python包索引https://pypi.org安装包。 您可以在浏览器中浏览Python包索引,也可以使用pip的有限搜索功能:
(tutorial-env) $ pip search astronomy
skyfield - Elegant astronomy for Python
gary - Galactic astronomy and gravitational dynamics.
novas - The United States Naval Observatory NOVAS astronomy library
astroobs - Provides astronomy ephemeris to plan telescope observations
PyAstronomy - A collection of astronomy related tools for Python.
...
pip有许多子命令:“search”,“install”,“uninstall”,“freeze”等。(请参阅安装Python模块指南以获取有关pip的完整文档。)
你可以通过指定包名安装最新版本的包
(tutorial-env) $ pip install novas
您还可以通过提供包名称,后跟==和版本号来安装特定版本的包:
(tutorial-env) $ pip install requests==2.6.0
如果你重新运行这个命令,pip会注意到请求的版本已经安装并且什么也不做。 您可以提供不同的版本号以获取该版本,或者可以运行pip install –upgrade将软件包升级到最新版本:
(tutorial-env) $ pip install --upgrade requests
pip uninstall 后面跟着一个或多个包名会把这些包从虚拟环境中移出
pip show会显示一个特定包的信息
(tutorial-env) $ pip show requests
pip list 会显示虚拟环境安装的所有的包
(tutorial-env) $ pip list
pip freeze会产生一个类似的已安装软件包列表,但输出使用pip install期望的格式。 一个常见的惯例是将这个列表放在一个requirements.txt文件中:
(tutorial-env) $ 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) $ pip install -r requirements.txt
pip有更多的选项。 请参阅安装Python模块指南以获取有关pip的完整文档。 当您编写了一个包并希望在Python Package Index中提供它时,请参阅Distributing Python Modules指南。