Python 版本管理 & 虚拟环境的那些事
好几个月前的一个月黑风高的深夜,和同事对 Python 的版本管理 & 虚拟环境进行了一些讨论。写一篇博客纪念一下,也算是作为个人的笔记。
如果你对 pyenv
, virtualenv
, virtualenv-wrapper
, venv
, pipenv
等一系列名词存在一些困惑,可以进来看看..
Python 版本管理管理
pyenv
**项目主页:**https://github.com/pyenv/pyenv **核心定位:**在一台电脑上同时管理多个 Python 版本。
下面摘录了一些个人觉得比较重要的信息。
1) Understanding PATH
/usr/local/bin:/usr/bin:/bin
In this example, the /usr/local/bin directory will be searched first, then /usr/bin, then /bin.
首先用上面这个例子理解 $PATH
的作用:在终端中可以执行的命令,都可以在这个环境变量指定的多个目录中,找到对应的可执行文件。并且搜索的规则为最先匹配。
➜ zblog git:(master) ✗ which mkdir
/bin/mkdir
➜ zblog git:(master) ✗
2) 执行过程
- Search your PATH for an executable file named pip
- Find the pyenv shim named pip at the beginning of your PATH
- Run the shim named pip, which in turn passes the command along to pyenv
pyenv
的原理就是在 PATH 的最前面加了一层 shims(垫片),所以当你在执行 python 命令时会自动切换至对应的版本。
3) 切换 python 版本
优先级:shell > local > global
pyenv shell
:$PYENV_VERSION
环境变量, 代表current shell session!pyenv local
: local.python-version
文件(向上搜索 recursively), 代表 current directory(project)pyenv global
:$(pyenv root)/version
, 代表系统默认的 python 版本
4) Demo
➜ unswco git:(develope) ✗ pyenv install 3.7.0
➜ unswco git:(develope) ✗ pyenv versions
➜ unswco git:(develope) ✗ pyenv global 3.7.0
➜ unswco git:(develope) ✗ pyenv which python
/Users/henry/.pyenv/versions/3.7.0/bin/python
虚拟环境管理
但区分 python 版本还不够,我们希望一个 python 版本可以对应多个虚拟环境(分别对应一个pip和各种第三方包),实现物理隔离。
1. virtualenv
每个 pythoner 入门时都会学习的 virtualenv, 就不多做解释了。三年前竟然还写过一个笔记,感兴趣可以看看:链接。
2. virtualenv-wrapper
定位为 virtualenv
的扩展插件,例如使用 workon
即可快速切换不同的 virtualenv
目录。
3. venv
Python 3.3 之后官方自带的虚拟环境管理,与 virtualenv
在实现上有一定不同,但看不到使用上有什么不同。
Source
4. Pipenv
Pipenv
在项目的依赖管理(application dependencies)做的还不错,比如它用了 hash 保证说你开发环境和线上的第三方包依赖是完全一致的。但个人尝试用过两次,确实体验不是很好。
发现网上有很多争论,感兴趣可以看下,还挺有意思的🍉
- https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/
- https://github.com/pypa/pipenv/commit/6d77e4a0551528d5d72d81e8a15da4722ad82f26
- https://np.reddit.com/r/Python/comments/8jd6aq/why_is_pipenv_the_recommended_packaging_tool_by/
其他
如果你只是想用 pip 安装一些全局的小工具,那么pipsi 或者 pipx 就是个不错的选择。它会为每个命令行工具自动生成一个虚拟环境:
p.s. 推荐使用 pipx
, 因为 pipsi
已经不再维护。
参考
- https://packaging.python.org/guides/installing-stand-alone-command-line-tools/
- https://packaging.python.org/tutorials/installing-packages/#creating-virtual-environments