原文链接 译者:Carvendy
12. 虚拟环境和包
12.1 介绍
Python应用程序总会使用一些包和模块,它们离不开标准库。应用程序需要指定标准库的版本,因为应用程序可能需要避免一个已经修复的bug,或者是应用程序重写了具体版本标准库的接口的实现。
这意味着也许不可能需要给每一个应用程序安装它所需要的的版本。如果应用A需要1.0的部分模块,而应用B需要版本2.0的,这样是会产生冲突的,并且只安装1.0或者2.0版本将会使得另外一个应用无法正常运行。
解决这个问题的方法就创建虚拟环境,它是一个自包含目录树,里面安装有Python各个版本,一个数字一个包版本地区分开来。
不同的应用程序可以使用不同的环境变量。为了解决前面的冲突,应用程序A可以有自己的虚拟环境并使用版本1.0,同时应用程序B可以使用虚拟环境的版本2.0。如果应用程序B需要升级到版本3.0,也一样不会对应用程序的环境影响。
12.2 创建虚拟环境
创建和管理虚拟环境的模块被称为venv。venv将会安装你可以用的最新Python版本。如果你的系统有多个版本,你可以指定一个版本并通过python3来运行,或者是你想要的方式。
为了创建虚拟环境,决定使用一个你想要的目录之前,要运行venv模块,即使用脚本指定目录:
python3 -m venv tutorial-env
如果不存在则创建tutorial-env目录,创建目录会包含一个拷贝的Python解释器、标准库、各种支持的文件。
当你创建一个虚拟环境,你需要激活它。
在Window上,运行:
tutorial-env/Scripts/activate.bat
在Unix或者是MacOS,运行:
source tutorial-env/bin/activate
激活虚拟环境,将会改变你当前在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']
>>>
12.3 使用pip管理包
你可以使用pip来实现安装,升级,和移除一个包。pip会默认安装了来自Python包索引,https://pypi.org/。你可以通过浏览器来浏览包索引,或者使用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”,等。(可以通过pip来查阅Python的安装模块的完整文档。)
你可以通过指定包名来安装最新的版本的。
(tutorial-env) $ 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) $ 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会检查到这个版本已经安装了不会做任何操作。你可以使用一个不同版本来安装,或者使用命令pip install –upgrade来更新最新版本:
(tutorial-env) $ 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
pip uninstall可以跟着一个或者多个包名,并从虚拟环境中移除这些包:
pip show会显示一个包的信息:
(tutorial-env) $ 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:
pip list会显示在虚拟环境中安装的所有包:
(tutorial-env) $ pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
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
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
pip已经有很多功能了。可以通过pip来查阅Python的安装模块的完整文档。当你在写一个包并希望把它发布到Python包索引,可以使用Python分布模块指南。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/61978.html