原地址
我们经常会遇到这样的开发需求,比如你手头有多个开发项目,其中项目A和项目B要求用python3,项目C需要用python2,而项目A和项目B又要求第三方依赖包相互独立,互不干扰。
为了满足这样的开发需求,我们需要在自己的电脑上安装多个Python版本,并且项目之间进行环境隔离。
要想安装多个Python版本,可以利用pyenv这个好用的工具,对于建立多个项目之间隔离的开发环境(就是虚拟环境啦),可以借助于pipenv这个更加好用的工具。
今天我们来介绍如何利用pyenv和pipenv来管理我们的python开发环境。根据这篇文章的介绍,你将能够:
- 在同一台电脑上管理多个Python版本
- 为每一个项目建立相互隔绝的虚拟环境
1、用pyenv安装多个Python版本
pyenv是Python版本管理工具,利用它我们可以在同一台电脑上安装多个版本的Python,这个过程非常简单。
1.1、安装或升级pyenv
首先安装pyenv,如果你是Mac电脑,那么推荐使用Homebrew来安装。
$ brew update
$ brew install pyenv
- 1
- 2
如果不是Mac电脑,那么就用github方式来安装,参考:
https://github.com/pyenv/pyenv#basic-github-checkout
要想升级pyenv,对于通过brew安装的pyenv可以执行:
$ brew upgrade pyenv
- 1
对于github安装的pyenv,可以执行:
$ pyenv update
- 1
快捷安装方式
https://github.com/pyenv/pyenv-installer # bash
https://github.com/mattberther/zsh-pyenv # oh my zsh
1.2、用pyenv安装Python
安装完pyenv,安装Python就简单了。我电脑上系统自带的是Python2.7.10,我准备再安装一个Python2.7.14和Python3.6.4,以后开发时候就用自己安装的Python2.7.14或者Python3.6.4了。
$ pyenv install 3.6.4 2.7.24
$ pyenv rehash
- 1
- 2
执行命令pyenv versions,如果输出结果如下,那么说明我们已经安装好了Python2.7.14和Python3.6.4:
$ pyenv versions
system
* 2.7.14 (set by /Users/chunming.liu/.pyenv/version)
* 3.6.4 (set by /Users/chunming.liu/.pyenv/version)
- 1
- 2
- 3
- 4
现在我们就可使用Python2.7.14和Python3.6.4了。执行这个下面python2、python3、python指令看看:
$ python2
Python 2.7.14 (default, Mar 16 2018, 10:31:53)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ python3
Python 3.6.4 (default, Mar 16 2018, 10:42:40)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ python
Python 3.6.4 (default, Mar 16 2018, 10:42:40)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
看到上面的输出,就表示安装ok了。这样,我们系统上就有Python2.7.14和Python3.6.4了。
我们可以通过pyenv global或者pyenv local切换Python版本:
lcm:~ chunming.liu$ pyenv global 3.6.4
lcm:~ chunming.liu$ pyenv versions
system
2.7.14
* 3.6.4 (set by /Users/chunming.liu/.pyenv/version)
- 1
- 2
- 3
- 4
- 5
pyenv global属于全局切换,pyenv local属于局部切换,局部切换只在所在切换时的目录中生效。
不过有了pipenv,我们不用手动切换Python版本了。
接下来我们就来开始为每个项目项目建立独立的开发环境。
2、用pipenv安装相互独立的虚拟环境
pipenv是Python官方推荐的包管理工具。 它综合了 virtualenv , pip 和 pyenv 三者的功能。能够自动为项目创建和管理虚拟环境。
pipenv使用 Pipfile 和 Pipfile.lock 来管理依赖包,并且在使用pipenv添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息,避免构建错误。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。
2.1、安装pipenv
如果你是Mac电脑,那么推荐使用Homebrew来安装。
$ brew install pipenv
- 1
如果不是Mac电脑,建议 使用Python3的pip3 安装:
$ pip3 install pipenv
- 1
执行pipenv,可以查看pipenv的帮助信息:
pipenv
- 1
2.2、为项目建立虚拟环境
我们希望在每个项目的根目录下保存虚拟环境目录(.venv),需要在 .bashrc 或 .bash_profile 中配置如下:
export PIPENV_VENV_IN_PROJECT=1
- 1
要想使配置生效,执行下source ~/.bashrc或者source ~/.bash_profile。
接下来我们为项目创建虚拟环境。
$ mkdir pipenv_demo
$ cd pipenv_demo
$ pipenv --three # 初始化一个python3虚拟环境,如果想初始化pyhton2的虚拟环境,则使用pipenv --two
- 1
- 2
- 3
创建完虚拟环境之后,在pipenv_demo目录下将会看到一个.venv的目录,这个目录就是pipenv_demo项目的虚拟环境。使用具体的python版本创建虚拟环境,可以执行:
pipenv --python 2.7.14
- 1
2.3、为项目安装第三方依赖包
为项目安装自己的依赖包到虚拟环境中,使每个项目拥有相互独立的第三方包,是非常不错的Python的开发实践。安装依赖包到虚拟环境中:
$ pipenv install flask
$ pipenv install pytest --dev # 用于区分需要部署到线上的开发包、只需要在测试环境中执行的包
- 1
- 2
执行完上面的命令后,检查一下是否安装成功:
$ pipenv graph
Flask==0.12.2
- click [required: >=2.0, installed: 6.7]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.10]
- MarkupSafe [required: >=0.23, installed: 1.0]
- Werkzeug [required: >=0.7, installed: 0.14.1]
pytest==3.4.2
- attrs [required: >=17.2.0, installed: 17.4.0]
- pluggy [required: >=0.5,<0.7, installed: 0.6.0]
- py [required: >=1.5.0, installed: 1.5.2]
- setuptools [required: Any, installed: 38.6.0]
- six [required: >=1.10.0, installed: 1.11.0]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可看到已经安装了Flask和pytest,还列出了他们的依赖包。
这是观察项目的根目录下,生成了两个文件,分别是Pipfile和Pipfile.lock。这两个文件记录了此项目的第三方依赖包,这两个文件的区别是 Pipfile中安装的包不包含包的具体版本号,而Pipfile.lock是包含包的具体的版本号的。
2.4 更新 pypi源来提高依赖库安装的速度
在使用pipenv的时候,常常会在安装的时候,一直卡在了 Locking 这里,通过加上 -v 参数,可以看到安装过程中的步骤信息,卡在了下载那里,这时应该可以意识到是因为网络的原因,pipenv创建的 Pipfile 中默认的pypi源是python官方的 https://pypi.python.org/simple。我们国内用户访问下载的时候会很慢。
所以,我一般会在创建好Pipfile以后,修改到文件中 source 块下的 url 字段,设置为国内的 pypi 源就好了,我推荐的是清华的pypi源或者阿里源,具体设置如下:
[[source]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
verify_ssl = true
name = "pypi"
- 1
- 2
- 3
- 4
3、使用虚拟环境进行开发
虚拟环境创建好了之后,就可以在里面进行开发了。
如果在命令行下开发,则在项目目录下执行pipenv shell,就进入到了虚拟环境中,在这个环境中,就已经包含安装过的所有第三方依赖包了,接下来就可以利用这些第三方包进行开发工作了。
如果是用Pycharm进行开发,就更简单了,直接用Pycharm打开项目目录就好了,打开后可以从Pycharm中的左侧导航栏里面看到External Libraries里面显示的是虚拟环境中的Python解释器。
4、删除安装的第三方包
如果是要删除虚拟环境中的第三方包,执行
pipenv uninstall flask
- 1
5、安装项目所有的依赖
用git管理项目时候,要把Pipfile和Pipfile.lock加入版本跟踪。这样clone了这个项目的同学,只需要执行
$ pipenv install
- 1
就可以安装所有的Pipfile中 [packages]部分的包了,并且自动为项目在自己电脑上创建了虚拟环境。
如果是想要安装[dev-packages]部分的包,需要执行:
$ pipenv install -d
- 1
上面的方法都是安装Pipfile中列出来的第三方包的最新版本,如果是想安装Pipfile.lock中固定版本的第三方依赖包,需要执行:
$ pipenv install --ignore-pipfile
- 1
如果你的项目之前使用requirements.txt来管理依赖的,那么使用pipenv安装所有依赖可以采用类似pip的方法:
$ pipenv install -r path/to/requirements.txt
- 1
6、团队实践建议
建议团队内开发人员,在自己电脑上都安装pyenv和pipenv。Pipfile和Pipfile.lock加入版本跟踪,.venv不要加入版本管理。为自己的每一个项目建立独立的虚拟环境。