包管理和虚拟环境

作者 耿嘉豪 日期 2018-04-22 阅读量 次
包管理和虚拟环境

包管理

安装第三方包

安装第三方包的方法有以下 3 种:

  1. 通过 Python 社区开发的 pip, easy_install 等工具。 这是最常见的方法。

  2. 使用系统本身自带的包管理器(yum, apt-get 等)。 由于是系统下对应版本的包, 官方可能不会及时地更新, 一般不推荐使用这种方法。

  3. 通过源码安装(python setup.py install)。 这种方法通常是在一些特殊的场景下使用, 比如不希望把包开源托管到外部, 或者是托管前的一个测试阶段等情况下。

easy_install

easy_install 是由 PEAK(Python Enterprise Application Kit) 开发的 setuptools 包里带的一个命令, 所以使用 easy_install 实际上是在调用 setuptools 来完成安装模块的工作。easy_install 是社区早期的包管理工具。

easy_install 的缺点:

  1. easy_install 只支持安装, 没有提供卸载、展示当前已安装的包列表等功能。

  2. 不能集中管理项目依赖列表, 包得一个一个安装。

  3. 安装的包不能缓存使用, 每次都得下载甚至编译。

  4. 终端上的输出不够友好

  5. easy_install 提供的 Python 应用打包部署方式(egg)现在来说有些过时了。

pip 及其优势

pip 是 easy_install 的替代品, 也是目前 Python 社区的主流的安装和管理包的工具。

pip 具有以下优势:

  1. pip 已经内置到 Python 2.7.9 和 Python 3.4 及其以上的版本里面。

  2. pip 支持安装、卸载、展示当前已安装的包列表等功能。

  3. pip 支持二进制包使用 wheel 格式(后缀是 .whl), 而 easy_install 不支持。

  4. pip 能非常友好地支持虚拟环境工具 virtualenv。

  5. 支持多种版本工具格式的包的下载和安装。

  6. 可以集中管理项目依赖列表(文件名字一般叫做 requirements.txt), pip 使用 -r 选项可以一次性安装这些依赖。

  7. 更好的终端输出效果。

  8. 可以对下载的包进行缓存。

ubuntu 下安装 pip

> sudo apt-get install python-pip -yq

> sudo pip install pip -U -q # 对包的更新, -q 表示静默安装, 减少输出过程

> pip --version # 查看 pip 版本

虚拟环境

Python 开发中可能会遇到一些环境的问题。比如说有些项目使用的是 Python2.7, 而另一些项目使用的是 Python3.6, 不同的项目之间使用不同的 Python 版本的某些包, 可能因为一些原因(比如依赖冲突)导致不能升级到最新版本, 并且考虑到生产环境的稳定性所以不能随意升级。如果所有的包都共用一个目录, 那因为一个项目依赖的更新可能就会影响到其他项目的依赖。所以我们需要使用虚拟环境对环境进行隔离。 Python 中创建和管理虚拟环境的工具主要有 virtualenv 和 pyvenv(也就是标准库里面的 venv)。这些工具可以帮助我们快速地创建一个单独的干净的 Python 环境, 可以把所需要的包安装到各自隔离的环境中。

virtualenv

virtualenv 用于在一台机器上创建多个独立的 Python 虚拟运行环境, 多个 Python 环境相互独立, 互不影响。这样用的另外一个原因是普通用户没有 root 用户这么高的权限, 可能安装不了包到全局, 而虚拟环境是对对应版本的 Python 的复制, 这样就没有权限问题。

virtualenv 默认会创建一个包含了 Python 可执行文件、常用的标准库和激活 virtualenv 的脚本的目录。

> sudo pip install virtualenv # 安装 virtualenv

> virtualenv venv # 创建虚拟环境

> source venv/bin/activate # 使用 source 激活环境

(venv) > which python
/home/jiangyanglinlan/venv/bin/python

(venv) > deactivate
>

venv

venv 是 Python3.3 引入的创建虚拟环境的模块, 是基于 virtualenv 进行改进的标准库。用法如下:

python -m venv /path/new/virtual/environment

pyvenv /path/to/new/virtual/environment # python3.6 开始 pyvenv 脚本已经不可用

pipenv

pipenv 是 Python 项目的依赖管理器。主要特性有:

  1. 根据 Pipfile 自动寻找项目根目录

  2. 如果不存在, 可以自动生成 Pipfile 和 Pipfile.lock

  3. 自动在项目目录的 .venv 目录创建虚拟环境。(这个目录地址通过设置WORKON_HOME改变)

  4. 自动管理 Pipfile 新安装和删除的包。

  5. 自动更新 pip

autoenv

autoenv 可以让我们在切换文件目录的时候, 自动完成切换虚拟环境。当进入一个含有 .env 文件的目录时, autoenv 会自动执行 .env 文件来设置系统环境。

> sudo pip install autoenv

> source /usr/local/bin/activate.sh

> mkdir test

> cd test

> touch .env

> echo "source /home/jiangyanglinlan/venv/bin/activate" > .env

> cd # 切换到其他目录

> cd test # 再次进入 test 目录, 出现如下提示:

autoenv:
autoenv: WARNING:
autoenv: This is the first time you are about to source /home/jiangyanglinlan/test/.env:
autoenv:
autoenv: --- (begin contents) ---------------------------------------
autoenv: source /home/jiangyanglinlan/venv/bin/activate
autoenv:
autoenv: --- (end contents) -----------------------------------------
autoenv:
autoenv: Are you sure you want to allow this? (y/N) y
(venv) > test

pyenv

pyenv 从名字来看和 pyvenv 很像, 但是这两个是完全不同的东西。pyenv 是 Python 版本管理工具。相对于虚拟环境, 它有以下特点:

  1. 它用来解决切换Python版本问题, 是切换虚拟环境的另外一种途径。

  2. 如果同 Python 版本多个虚拟环境情况下它是没有办法解决的, 这种情况下还得用虚拟环境。

  3. Python 社区方面, 它不是官方接受的解决方案, 没有社区强力支持