包管理
安装第三方包
安装第三方包的方法有以下 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
> 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 项目的依赖管理器。主要特性有:
-
根据 Pipfile 自动寻找项目根目录
-
如果不存在, 可以自动生成 Pipfile 和 Pipfile.lock
-
自动在项目目录的 .venv 目录创建虚拟环境。(这个目录地址通过设置WORKON_HOME改变)
-
自动管理 Pipfile 新安装和删除的包。
-
自动更新 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 版本管理工具。相对于虚拟环境, 它有以下特点:
-
它用来解决切换Python版本问题, 是切换虚拟环境的另外一种途径。
-
如果同 Python 版本多个虚拟环境情况下它是没有办法解决的, 这种情况下还得用虚拟环境。
-
Python 社区方面, 它不是官方接受的解决方案, 没有社区强力支持
网友评论