网上看到一篇博文,我突然也想写一下自己正在使用的 Python 环境设置,以及对应的工具链。众众众所周知,Python 环境管理是个很大很大的坑,坑里面有无数新人 or 老司机的尸体。而 Python 环境管理的工具又五花八门,所以可能每个人的设置都不尽相同。我列出的我使用的工具链,至少最大地满足了自己的需求,但不一定满足所有人的需求。但我自认为在 Python 环境管理方面颇有心得,所以有一定的参考价值。
我的需求
照例列一下我的需求:
我平时在三种不同的环境中使用 Python,除了公司项目规定使用 Python 3.6 以外,个人项目都是尽可能用最新版:
- Python 3.6.8 + Linux(公司,公司项目)
- Python latest + Windows(公司,个人项目)
- Python latest + MacOS(在家,个人项目)
我同时工作在多个项目上,所以隔离环境非常重要
除非非常必要,否则不用 docker
我用到很多 Python 的命令行工具:black, twine, …
系统上保留的 Python 数量尽可能少,但我绝不会干升级系统 Python 这种事的,所有系统 Python 是什么就是什么,我不会去碰它
使用的工具
1. Python 版本管理: PythonUp(posix), None(Windows)
为何不是 pyenv?
pyenv
把所有 Python 版本都分开安装,就算是 patch release。这样做可以最大可能地保证你机器上的所有虚拟环境、命令行程序都是可用的,但我会嫌 python 的版本太多了,毕竟 99.99%的情况下,Python 3.7.4 都可以平滑替换为 Python 3.7.5 而不造成任何损失。
PythonUp
就是这样一个工具,它同时支持 posix + windows 平台。你可以把它看成是pyenv
的简化版,但它是支持 minor release 层面隔离的,如果只是 patch release 升级是直接替换的。使用方法很简单:
$ pythonup install 3.6
$ pythonup install 3.8
$ pythonup use 3.8
$ python3 --version
Python 3.8.0
但要注意它相比pyenv
要少一些功能:
- 自动激活 local python 版本
- 管理虚拟环境
- 全局解释器名称为
python3
,pip3
而不是python
,pip
Windows 呢?
我在 Windows 上没有用任何工具管理 Python 版本,因为 Python 的 Windows 安装器本身就支持替换升级(patch update),而且全局的 Python 命令行程序不会受到任何影响。而且 Windows 上的 Python 3 自带一个py
的版本启动器,可以方便地选择运行的 Python:
> py -2 --version
Python 2.7.15
> py -3 --version
Python 3.8.0
所以我基本也不用切换 python 版本了(py -3
运行起来比python
还短些)
2. 安装命令行程序: pipx
把命令行程序安装在隔离的环境中,不会搞乱依赖。原来有一个工具叫pipsi
但它停止维护了,pipx
是活跃状态而且更加好用,强烈推荐!使用起来也很简单,只需要在原来pip install
安装的基础上加一个x
就可以了:
$ pipx install black
3. 虚拟环境、依赖管理:Pipenv@master 分支 + virtualenv 魔改版
master 分支
Pipenv 被诟病最多的就是已经近一年没有新版发布了,使用 Github 上的 master 分支完美解决这个问题,嘿嘿,几个月使用来看,bug 已经相当少了。
virtualenv 魔改了什么?
Pipenv 是使用virtualenv
来创建虚拟环境的,但virtualenv
有几个重大缺陷,大到我忍不了所以搞了个fork
- virtualenv 中的 python 无法再创建虚拟环境
- virtualenv 指向的 python 升级则环境变成 broken 状态
而 Python 3 自带的 venv 能解决这些问题,不明白为什么 virtualenv 还不支持 venv,我只能 fork 一下使得 virtualenv 尽可能使用 python3 自带的 venv 来创建虚拟环境。 使用virtualenv
魔改版替换原版:
$ pip install -I https://github.com/frostming/virtualenv-venv/releases/download/16.4.4-fork/virtualenv-16.2.0_fork-py2.py3-none-any.whl
fork 版本的更新并不能跟上上游的更新,主要也是因为没碰到什么 bug 且目前只有我自己在用。
Poetry 呢
Poetry 确实也相当好用且有越来越多的人从 Pipenv 切换过去,但对我来说 Poetry 没解决这两个问题之前我不会切过去(也可能已经改进了,有一段时间没用过):
- 更多的虚拟环境的管理:清理,删除,查看
- poetry 的
pyproject.toml
还不是标准,配置文件格式还有许多问题(C 扩展定义、markers 支持等),如果切换到 poetry 会破坏兼容性导致项目只能用 poetry 开发。