包管理和虚拟环境

作者: 江洋林澜 | 来源:发表于2018-04-22 00:03 被阅读0次

    包管理

    安装第三方包

    安装第三方包的方法有以下 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 中创建和管理虚拟环境的工具主要有 virtualenvpyvenv(也就是标准库里面的 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 社区方面, 它不是官方接受的解决方案, 没有社区强力支持

    相关文章

      网友评论

        本文标题:包管理和虚拟环境

        本文链接:https://www.haomeiwen.com/subject/wxqqlftx.html