12. 虚拟环境和包

未匹配的标注
本文档最新版为 3.8,旧版本可能放弃维护,推荐阅读最新版!

12.1. 简介

Python 应用程序经常会使用一些不属于标准库的包和模块。应用程序有时候需要某个特定版本的库,因为它需要一个特定的 bug 已得到修复的库或者它是使用了一个过时版本的库的接口编写的。

这就意味着可能无法安装一个 Python 来满足每个应用程序的要求。如果应用程序 A 需要一个特定模块的 1.0 版本但是应用程序 B 需要该模块的 2.0 版本,这两个应用程序的要求是冲突的,安装版本 1.0 或者版本 2.0 将会导致其中一个应用程序不能运行。

这个问题的解决方案就是创建一个 虚拟环境 (通常简称为 "virtualenv"),包含一个特定版本的 Python,以及一些附加的包的独立的目录树。

不同的应用程序可以使用不同的虚拟环境。为了解决前面例子中的冲突,应用程序 A 可以有自己的虚拟环境,其中安装了特定模块的 1.0 版本。而应用程序 B 拥有另外一个安装了特定模块 2.0 版本的虚拟环境。如果应用程序 B 需求一个库升级到 3.0 的话,这也不会影响到应用程序 A 的环境。

12.2. 创建虚拟环境

用于创建和管理虚拟环境的脚本叫做 pyvenvpyvenv 通常会安装你可用的 Python 中最新的版本。这个脚本也能指定安装一个特定的版本的 Python,因此如果在你的系统中有多个版本的 Python 的话,你可以运行 pyvenv-3.5 或者你想要的任何版本来选择一个指定的 Python 版本。

要创建一个 virtualenv,首先决定一个你想要存放的目录接着运行 pyvenv 后面携带着目录名:

python3 -m venv tutorial-env

如果目录不存在的话,这将会创建一个 tutorial-env 目录,并且也在目录里面创建一个包含 Python 解释器,标准库,以及各种配套文件的 Python "副本"。

一旦你已经创建了一个虚拟环境,你必须激活它。

在 Windows 上,运行:

tutorial-env\Scripts\activate.bat

在 Unix 或者 MacOS 上,运行:

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']
>>>

12.3. 用 pip 来管理包文件

你可以用 pip 来安装、升级和删除你的包文件。默认情况下 pip 会从 Python Package Index 来装所需要的包文件, <pypi.org>。 你可以在你的浏览器中查看 Python Package Index 的所有包文件,或者用 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
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 还有更多的功能。你可以在安装 Python 模块查阅 pip 的完整手册。 如果你想把自己写的包文件能在 Python Package Index 上被大家看到,请参考文档 分发 Python 模块

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~