python虚拟环境学习

下图展示了python的包管理和环境管理越来越复杂和混乱,我在日常工作中也碰到了类似问题。目前我的Mac自带的Python是2.7.14,由于工作需要,部分项目需要Python 3.x版本。此时需要在系统中安装多个Python,但又不能影响系统自带的Python。达到实现Python的多版本共存,pyenv就是这样一个Python版本管理器,方便我在项目中来回切换python版本,搭配virtualenv或者pipenv使用效果更佳。

python.jpg

1 pyenv

pyenv 是一个开源的Python版本管理工具,可以轻松地给系统安装任意Python版本,想玩哪个版本,瞬间就可以切换。有了pyenv,我们不需要再为系统多版本Python共存问题而发愁,也不用为手动编译安装其他Python版本而浪费时间,只需要执行一条简单的命令就可以切换并使用任何其他版本,该工具真正地做到了开箱即用,非常简单实用。

1.1 安装和配置

mac下直接通过homebrew安装。

brew update
brew install pyenv

为pyenv配置环境变量。(我用的shell为zsh)

#if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
#export PYENV_ROOT=/usr/local/var/pyenv

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

if which pyenv > /dev/null;
then eval "$(pyenv init -)";
fi

1.2 常用命令

  • 查看有哪些Python版本可以安装

    pyenv install --list
    
  • 安装某个Python版本

    pyenv install -v 版本号
    
  • 查看当前系统中安装的python

    pyenv versions
    
  • 设置python版本

    # 设置全局版本,全局生效
    python global 版本号
    # 设置局部版本,仅在指定文件夹下生效
    python local 版本号
    

2 virtualenv

virtualenv是一个用来创建完全隔离的Python虚拟环境的工具,可以为每个项目工程创建一套独立的Python环境,从而可以解决不同工程对Python包,或者版本的依赖问题。假如有 A 和 B 两个工程,A 工程代码要跑起来需要requests 1.18.4,而B工程跑起来需要requests 2.18.4,这样在一个系统中就无法满足两个工程同时运行问题了。最好的解决办法是用virtualenv给每个工程创建一个完全隔离的Python虚拟环境,给每个虚拟环境安装相应版本的包,让程序使用对应的虚拟环境运行即可。这样既不影响系统Python环境,也能保证任何版本的Python程序可以在同一系统中运行。

2.1 安装和配置

sudo pip install virtualenv

2.2 常用命令

  • 创建虚拟环境

    mkdir myproject
    # 使用系统当前的Python版本创建虚拟环境
    virtualenv venv
    # 创建虚拟环境时指定Python版本
    virtualenv -p ~/.pyenv/versions/2.7.10/bin/python venv
    
  • 激活创建的虚拟环境并使用

    source venv/bin/activate
    
  • 退出虚拟环境回到系统版本

    deactivate
    

3 pipenv

pipenv 是Kenneth Reitz大神的作品,能够有效管理Python多个环境,各种包。上面讲了用pyenv+virtualenv搭建虚拟环境,管理python版本,但是跨平台的使用不太一致,且有时候处理包之间的依赖总存在问题。另外过去也常常用pip进行包的管理,pip已经足够好,但是仍然推荐pipenv,相当于virtualenv和pip的合体,且更加强大。 pipenv有以下特性

  • pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷
  • 过去用virtualenv管理requirements.txt文件可能会有问题,Pipenv使用Pipfile和Pipfile.lock,后者存放将包的依赖关系,查看依赖关系是十分方便
  • 各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞
  • 通过加载.env文件简化开发工作流程
  • 支持Python2 和 Python3,在各个平台的命令保持一致

3.1 安装和配置

pip3 install pipenv

3.2 常用命令

  • 创建虚拟环境

    # 使用本地默认python版本创建虚拟环境
    pipenv install
    # 使用指定python版本创建虚拟环境
    pipenv --python 3.7
    
  • 激活虚拟环境

    pipenv shell
    
  • 包管理

    # 安装第三方模块, 运行后会生成Pipfile和Pipfile.lock文件
    # 安装包(默认最新可用版本)
    pipenv install flask
    # 安装指定版本的包
    pipenv install flask==0.12.1
    # 在开发环境安装包
    pipenv install pytest --dev
    # 删除包
    pipenv uninstall pytest
    

    无论是生产环境还是开发环境的包都会写入一个Pipfile里面,而如果是用传统方法,需要2个文件:dev-requirements.txt 和 test-requirements.txt。接下来如果在开发环境已经完成开发,如果想进行生产环境构建。这时候就要使用Pipfile.lock了,运行以下命令,把当前环境的模块lock住, 它会更新Pipfile.lock文件,该文件是用于生产环境的。

  • Pipfile和Pipfile.lock

    # 在生产中恢复环境至与开发环境保持一致,copy Pipfile.lock到生产环境,然后执行以下一条命令
    pipenv install --ignore-pipfile
    # 如果要在另一个开发环境做开发,则将代码和Pipfile复制过去,运行以下命令
    pipenv install --dev
    

    由于Pipfile里面没有所有子依赖包或者确定的版本,因此该安装可能会更新未指定模块的版本号,这不仅不是问题,还解决了一些其他问题,我在这里做一下解释:假如该命令更新了一些依赖包的版本,由于我肯定还会在新环境做单元测试或者功能测试,因此我可以确保这些包的版本更新是不会影响软件功能的;然后我会pipenv lock并把它发布到生产环境,因此我可以确定生产环境也是不会有问题的。这样一来,我既可以保证生产环境和开发环境的一致性,又可以不用管理众多依赖包的版本。

  • 常用命令列表

    表1  pipenv常用指令
    命令 功能
    pipenv –where 列出本地工程路径
    pipenv –venv 列出虚拟环境路径
    pipenv –py 列出虚拟环境的Python可执行文件
    pipenv install 创建虚拟环境
    pipenv isntall [moduel] 安装包
    pipenv install [moduel] –dev 安装包到开发环境
    pipenv uninstall[module] 卸载包
    pipenv uninstall –all 卸载所有包
    pipenv graph 查看包依赖
    pipenv lock 生成lockfile
    pipenv run python [pyfile] 运行py文件
    pipenv –rm 删除虚拟环境