我们经常会遇到这样的开发需求,比如你手头有多个开发项目,其中项目A要求用python3.7,项目B需要用python3.6,有要求项目A和项目B依赖包相互独立,互不干扰。为了满足这样的开发需求,我们需要在自己的电脑上安装多个Python版本,并且项目之间进行环境隔离。要想安装多个Python版本,可以利用pyenv这个好用的工具,对于建立多个项目之间隔离的开发环境,可以借助于pipenv这个更加好用的包管理工具。
这篇文章将给大家介绍如何利用pyenv和pipenv来管理我们的python开发环境,主要讲两个核心内容:
1.如何在同一台电脑上管理多个版本Python;
2.为每一个项目建立相互隔绝的虚拟环境。
01 — 安装多个Python版本
我们自己开发的多个项目或者从github上clone的项目,可能依赖不同的Python解释器。因此,我们要想运行这些项目,在工作电脑上就要安装不同版本的Python。
pyenv是Python版本管理工具,利用它可以在同一台电脑上安装多个版本的Python,这个过程非常简单。
1.1、安装或升级pyenv
首先安装pyenv,如果你是Mac电脑,那么推荐使用Homebrew来安装。
$ brew update && brew install pyenv
要想升级pyenv,则可以执行:
$ brew update && brew upgrade pyenv
如果不是Mac电脑,那么就用github方式来安装:
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile $ exec "$SHELL"
这种安装方式的详细说明,还是建议大家参考官方文档:https://github.com/pyenv/pyenv#basic-github-checkout。
对于github安装的pyenv,可以按下面方式进行升级:
$ cd $(pyenv root) $ git fetch $ git tag v1.2.18 $ git checkout v1.2.18
pyenv安装完成后,需要将$(pyenv root)/shims添加到PATH变量前面,这一步非常关键。
$ echo 'export PATH="$(pyenv root)/shims:$PATH"' >> ~/.bash_profile $ source ~/.bash_profile
1.2、用pyenv安装Python
安装完pyenv,可以安装Python啦,一共需要两步。
$ pyenv install 3.7.7 $ pyenv rehash
执行命令pyenv versions查看安装结果。
$ pyenv versions system * 3.7.7 (set by /Users/chunming.liu/.pyenv/version)
可以看到,已经成功安装了Python 3.7.7,安装的位置在/Users/chunming.liu/.pyenv。
1.3、切换Python版本
可以通过pyenv global或者pyenv local切换Python版本。pyenv global属于全局切换,切换完成后,在系统中任何地方执行python,你会发现都是同样的Python版本。
$ pyenv global 3.7.7 $ pyenv versions system * 3.7.7 (set by /Users/chunming.liu/.pyenv/version)
可以看到,3.7.7前面有一个星号,说明成功切换到了3.7.7版本,可以执行一下python来验证一下:
$ python Python 3.7.7 (default, Apr 12 2020, 12:31:11) [Clang 11.0.0 (clang-1100.0.33.17)] on darwin Type "help", "copyright", "credits" or "license" for more information.
pyenv local属于局部切换,只能修改当前目录下的Python版本,出了当前目录则失效。
接下来,开始为每个项目建立独立的开发环境。
02 — 用Pipenv创建虚拟环境
Pipenv是Python官方推荐的包管理工具。它综合了 virtualenv , pip 和 pyenv 三者的功能。你可以使用pipenv这一个工具来安装、卸载、跟踪和记录依赖性,并创建、使用和组织你的虚拟环境。
2.1、安装和升级pipenv
如果你是Mac电脑,那么推荐使用Homebrew来安装和升级pipenv:
$ brew update && brew install pipenv $ brew update && brew upgrade pipenv
也可以通过pip来安装和升级pipenv:
$ pip install pipenv $ pip install --upgrade pipenv
2.2、为项目建立虚拟环境
进入到项目目录中,通过下面的指令为项目创建虚拟环境。
$ mkdir pipenv_demo $ cd pipenv_demo $ pipenv --python 3.7.7 Creating a virtualenv for this project… Pipfile: /Users/chunming.liu/work/pipenv_demo/Pipfile Using /Users/chunming.liu/.pyenv/versions/3.7.7/bin/python3 (3.7.7) to create virtualenv… ⠙ Creating virtual environment...Using base prefix '/Users/chunming.liu/.pyenv/versions/3.7.7' New python executable in /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda/bin/python3 Also creating executable in /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda/bin/python Installing setuptools, pip, wheel... done. Running virtualenv with interpreter /Users/chunming.liu/.pyenv/versions/3.7.7/bin/python3 ✔ Successfully created virtual environment! Virtualenv location: /Users/chunming.liu/.local/share/virtualenvs/pipenv_demo-RYMSREda
上面的操作,给pipenv_demo这个项目初始化了一个Python 3.7.7的虚拟环境,并在项目录下生成一个项目依赖包文件Pipefile。如果系统中没有3.7.7版本的Python,pipenv会调用pyenv来安装对应的Python的版本。
默认地,虚拟环境会创建在~/.local/share/virtualenvs目录里面。我们也可以通过pipenv --venv查看项目的虚拟环境目录。可以通过 pipenv --rm 删除虚拟环境。
如果想更改虚拟环境的目录,可以在 .bashrc 或 .bash_profile 中,设置环境变量WORKON_HOME,指定虚拟环境的目录所在位置,比如想将虚拟环境放到~/.venvs目录,则可以执行下面的命令。
$ echo 'export WORKON_HOME=~/.venvs' >> ~/.bash_profile $ source ~/.bash_profile
如果希望在项目目录下创建虚拟环境目录(.venv),需要在 .bashrc 或 .bash_profile 中配置环境变量PIPENV_VENV_IN_PROJECT:
$ echo 'export PIPENV_VENV_IN_PROJECT=1' >> ~/.bash_profile $ source ~/.bash_profile
03 — 用Pipenv管理依赖包
pipenv使用 Pipfile 和 Pipfile.lock 来管理依赖包,并且在使用pipenv添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。
3.1 安装依赖包
为项目安装依赖包到虚拟环境中,使每个项目拥有相互独立的依赖包,是非常不错的Python的开发实践。安装依赖包到虚拟环境中的方法:
$ pipenv install pytest Installing pytest… Adding pytest to Pipfile's [packages]… ✔ Installation Succeeded Pipfile.lock not found, creating… Locking [dev-packages] dependencies… Locking [packages] dependencies… ✔ Success! Updated Pipfile.lock (1c4d3d)! Installing dependencies from Pipfile.lock (1c4d3d)…