包管理
安装第三方包
安装第三方包的方法有以下 3 种:
通过 Python 社区开发的 pip, easy_install 等工具。 这是最常见的方法。
使用系统本身自带的包管理器(yum, apt-get 等)。 由于是系统下对应版本的包, 官方可能不会及时地更新, 一般不推荐使用这种方法。
通过源码安装(python setup.py install)。 这种方法通常是在一些特殊的场景下使用, 比如不希望把包开源托管到外部, 或者是托管前的一个测试阶段等情况下。
easy_install
easy_install 是由 PEAK(Python Enterprise Application Kit) 开发的 setuptools 包里带的一个命令, 所以使用 easy_install 实际上是在调用 setuptools 来完成安装模块的工作。easy_install 是社区早期的包管理工具。
easy_install 的缺点:
easy_install 只支持安装, 没有提供卸载、展示当前已安装的包列表等功能。
不能集中管理项目依赖列表, 包得一个一个安装。
安装的包不能缓存使用, 每次都得下载甚至编译。
终端上的输出不够友好
easy_install 提供的 Python 应用打包部署方式(egg)现在来说有些过时了。
pip 及其优势
pip 是 easy_install 的替代品, 也是目前 Python 社区的主流的安装和管理包的工具。
pip 具有以下优势:
pip 已经内置到 Python 2.7.9 和 Python 3.4 及其以上的版本里面。
pip 支持安装、卸载、展示当前已安装的包列表等功能。
pip 支持二进制包使用 wheel 格式(后缀是 .whl), 而 easy_install 不支持。
pip 能非常友好地支持虚拟环境工具 virtualenv。
支持多种版本工具格式的包的下载和安装。
可以集中管理项目依赖列表(文件名字一般叫做 requirements.txt), pip 使用 -r 选项可以一次性安装这些依赖。
更好的终端输出效果。
可以对下载的包进行缓存。
ubuntu 下安装 pip
> sudo apt-get install python-pip -yq |
虚拟环境
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 |
venv
venv 是 Python3.3 引入的创建虚拟环境的模块, 是基于 virtualenv 进行改进的标准库。用法如下:
python -m venv /path/new/virtual/environment |
pipenv
pipenv 是 Python 项目的依赖管理器。主要特性有:
根据 Pipfile 自动寻找项目根目录
如果不存在, 可以自动生成 Pipfile 和 Pipfile.lock
自动在项目目录的 .venv 目录创建虚拟环境。(这个目录地址通过设置WORKON_HOME改变)
自动管理 Pipfile 新安装和删除的包。
自动更新 pip
autoenv
autoenv 可以让我们在切换文件目录的时候, 自动完成切换虚拟环境。当进入一个含有 .env 文件的目录时, autoenv 会自动执行 .env 文件来设置系统环境。
> sudo pip install autoenv |
pyenv
pyenv 从名字来看和 pyvenv 很像, 但是这两个是完全不同的东西。pyenv 是 Python 版本管理工具。相对于虚拟环境, 它有以下特点:
它用来解决切换Python版本问题, 是切换虚拟环境的另外一种途径。
如果同 Python 版本多个虚拟环境情况下它是没有办法解决的, 这种情况下还得用虚拟环境。
Python 社区方面, 它不是官方接受的解决方案, 没有社区强力支持