说实话,搞Python开发最烦什么?不是写bug,是版本打架。
你想想,系统自带的可能是Python 2.7,项目A要用3.8,项目B死活得跑3.10,还有个老项目卡在3.6……再加上venv、conda一通折腾,有时候自己都忘了当前用的到底是哪个版本。pip装个包,装完发现跑不起来,一查——装到系统Python里去了。这种情况,我猜你也遇到过。
后来我发现了pyenv,一个纯shell脚本写的Python版本管理工具。不是什么大框架,就干一件事:让你轻松在不同Python版本之间切来切去。而且它不依赖Python本身——这点很关键,不像某些工具,你要先装Python才能用它们装Python,这不是套娃吗?
它能做什么?
说白了就三招:
- • 全局切换:比如你平时用3.10.4,一条
pyenv global 3.10.4搞定,以后打开终端默认就是它。 - • 项目级切换:进到项目文件夹,运行
pyenv local 3.8.12,目录下自动生成一个.python-version文件。下次cd进来,Python自动切到3.8。再也不用在脑子里记“哪个项目用哪个版本”了。 - • 临时覆盖:当前终端会话想换个版本试试?
pyenv shell 3.11.0,只在这一个窗口生效。
还有个玩法:你可以同时指定多个版本,比如pyenv global 3.10 3.9 2.7,然后直接运行python3.10、python3.9、python2.7,互不干扰。配合tox做多版本测试,舒服得一批。
怎么装?别怕,很简单
Mac用户一把梭:
brew install pyenv
Linux/Unix用户用自动安装脚本:
curl https://pyenv.run | bash
然后往你的~/.bashrc或~/.zshrc里加三行:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval"$(pyenv init -)"
重启终端,完事儿。
Windows用户也别慌,有个pyenv-win的移植版,或者用WSL,一样跑。
日常怎么用?
举个例子,你想装Python 3.10.4:
pyenv install 3.10.4
装完看看有哪些版本:
pyenv versions
想切换到刚装的版本:
pyenv global 3.10.4
哪天不想要了:
pyenv uninstall 3.10.4
就这么简单。
说点实在的
我之前也试过pythonbrew、pythonz,但pyenv最让我安心的是——它从不乱改你的shell。它只是在PATH前面插了一个自己的“替身目录”(叫shims),你敲python的时候,实际敲的是这个替身,替身再根据当前目录的.python-version或者环境变量,把命令转给真正的Python。
这种设计很Unix哲学:每个工具只做一件事,做好了就拼在一起。所以pyenv跟virtualenv、pipenv、poetry都不冲突。你甚至可以装个pyenv-virtualenv插件,让pyenv直接替你管理虚拟环境。
当然也有小坑。比如某些系统自带的PATH设置顺序会导致pyenv不生效,这时候把eval "$(pyenv init --path)"加到~/.profile里就好。还有,如果你是折腾型选手,不想要shims,也能用pyenv exec直接调用——不过大多数人用默认配置就足够了。
总结一下
pyenv不是什么黑科技,没有花哨的界面,就是命令行里踏踏实实帮你管Python版本。但正是这种踏实,让我从“版本混乱”的泥坑里爬了出来。如果你也被Python版本折腾得够呛,花十分钟试试pyenv,大概率就回不去了。
项目地址:https://github.com/pyenv/pyenv