pyenv 可以帮助你在开发或者生产环境里安装和管理多个 Python 版本。这对于 Python 开发者而言非常有用。
比如在 Ubuntu 12.04 上(这个版本的 Ubuntu 曾经非常流行,至今仍然驱动了很多重要系统),系统自带的 Python 版本是 2.7.6。而这个版本的 Python 缺乏对一个重要的 SSL 功能的支持—— Server Name Indication,简称 SNI。这样当你在使用如 requests 这样的 HTTP 库访问一些 HTTPS API 时,就会遇到证书错误。
对 SNI 的支持是在 Python 2.7.9 时从 Python 3 里 backport 过来的。而借助 pyenv,我们就可以在一些非常古老或者不方便升级 Python 版本的系统里用上最新版本的 Python,同时完全不会影响到系统自带的 Python 版本。
这是在 Ubuntu Linux 上使用 pyenv 安装 Python 2.7.14 (本文写作时 Python 2 的最新版本)的步骤:
首先安装一些必要的工具和支持库:
sudo apt-get install git build-essential libreadline-dev libsqlite3-dev libbz2-dev libssl-dev zlib1g-dev
然后获得 pyenv 的最新版本:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
然后在 .bashrc 中添加三行指令,让系统可以找到 pyenv 安装的 Python:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
之后你需要重启你的 shell 来让上面添加的 3 条指令生效。你可以登出再登录,或者简单的执行下面这个指令:
exec $SHELL
然后就可以用 pyenv 安装你需要的任何 Python 版本了,比如 2.7.14:
pyenv install 2.7.14
安装完成之后,你可以通过这条指令查看目前系统里所有的 Python 版本:
pyenv versions
你可以把某个版本设置为全局使用:
pyenv global 2.7.14
或是只对当前所在目录生效:
pyenv local 2.7.14
如果是设置为只对当前目录有效,那么在当前目录下会产生一个名为 .python-version 的文件,其中的内容是版本号。pyenv 就是根据这个文件的内容来确定当前目录应该使用哪个版本的 Python。
关于 pyenv 的完整文档你可以在这里看到:
|      1HFcbyqP0iVO5KM05      2018-01-05 09:16:21 +08:00 via Android 已经是我 Python 开发环境下必用的工具 | 
|  |      2XIVN1987      2018-01-05 09:23:15 +08:00 virtualenv、pyenv、pipenv,,工具太多,都搞糊涂了,,还是继续用古老的 virtualenv 吧先(╥╯^╰╥) | 
|  |      3qq976739120      2018-01-05 09:25:32 +08:00 推荐 anaconda,简直懒人必备 | 
|  |      4mimzy      2018-01-05 09:32:44 +08:00 配合 https://github.com/pyenv/pyenv-virtualenv 风味更佳 解决阿里云 pyenv 无法下载的问题 /t/256328 @qq976739120 #3 pyenv install anaconda3-5.0.1 | 
|  |      5est      2018-01-05 09:33:50 +08:00 推荐直接 miniconda3 | 
|      6quinoa42      2018-01-05 09:36:07 +08:00 再安利下 neovim 调用 pyenv: https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim 我的相关配置: ``` if has("nvim") let g:python_host_prog = $HOME . "/.pyenv/versions/neovim2/bin/python" let g:python3_host_prog = $HOME . "/.pyenv/versions/neovim3/bin/python" endif ``` ``` " use flake8 installed at the virtualenv for neovim let g:ale_python_flake8_executable = $HOME . "/.pyenv/versions/neovim3/bin/flake8" let g:ale_python_flake8_use_global = 1 " use yapf installed at the virtualenv for neovim let g:ale_python_yapf_executable = $HOME . "/.pyenv/versions/neovim3/bin/yapf" let g:ale_python_yapf_use_global = 1 " use isort installed at the virtualenv for neovim let g:ale_python_isort_executable = $HOME . "/.pyenv/versions/neovim3/bin/isort" let g:ale_python_isort_use_global = 1 ``` | 
|  |      7Livid MOD OP PRO  4 | 
|  |      8onlyice      2018-01-05 09:39:42 +08:00 推荐 anaconda +1,pyenv 是自己下源码编,某些情况下可能不如 anaconda 直接编好的二进制分发 | 
|  |      9sikariba      2018-01-05 09:40:26 +08:00 还是 anaconda 爽 | 
|  |      10rogwan      2018-01-05 09:48:38 +08:00 via Android 新版 pycharm 里面可以自动设置 pyenv 吗?(默认支持的是 virtualenv ) | 
|  |      11javlib      2018-01-05 09:53:04 +08:00  1 分享一个安装方面的技巧: pyenv install 命令会先去 python 官网下载对应的版本包,然后编译安装。因为网络缘故,在国内下载非常慢,有时候甚至被墙,这时候可以把以前下载的 python 安装包(后缀是'tar.xz')放在$PYENV_ROOT/cache 下,可以跳过下载。 | 
|  |      12bomb77      2018-01-05 09:58:47 +08:00  1 @rogwan PERFERENCE 里的 project interpreter 设置成 pyenv 里安装的 python 环境就可以,包括 pyenv virtualenv 也可以 一般类似~/.pyenv/versions/3.6.3/bin/python 这样子 | 
|  |      15korvin      2018-01-05 10:17:18 +08:00  1 @javlib 直接用国内的源,速度快的一批,自用科大,我记得 v2 好像也有源 中国科学技术大学: https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ 清华大学 TUNA: https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣: https://pypi.douban.com/simple | 
|  |      19forever139      2018-01-05 10:27:26 +08:00 一直在生产上的 python2 用 pyenv + virtualenv 的插件,这样可以用一个 pyenv 既可以管理不同 python 版本,又可以管理不同虚拟环境。 不知道现在有人在生产上用 python3 的 venv 来管理的吗?也不知道最佳实践是怎样的。 所以我现在生产上的 python3 还是用 pyenv 来管理 | 
|  |      20qsnow6      2018-01-05 10:37:05 +08:00 习惯用 pyenv 吧,自带的 venv 没有太多资料,用不习惯 | 
|  |      22raysonx      2018-01-05 10:48:41 +08:00 pyenv  virtualenv 万年不支持路径中带空格 | 
|  |      23mulog      2018-01-05 10:52:53 +08:00 pyenv + virtualenv 插件的确好用 已经成为我的必备工具了 发现有不少好东西都是从 ruby 那边过来的 比如 pyenv <- rbenv | 
|  |      24wellsc      2018-01-05 10:53:15 +08:00 virtualenv 足够了 | 
|  |      25usenix      2018-01-05 10:54:43 +08:00 刚把 pyenv 卸载了,用上了 pipenv。。。 | 
|  |      26flowfire      2018-01-05 11:27:52 +08:00 python 用的不多,是不是类似于 python 版的 nvm。。。 | 
|  |      27yanchao7511461      2018-01-05 11:31:25 +08:00 我用 conda | 
|      29SuperMild      2018-01-05 11:38:10 +08:00 能用 conda 的解决就尽量用 conda,conda 环境隔离得很彻底,安装库也方便 | 
|  |      30okampfer      2018-01-05 11:39:17 +08:00 @Livid 我来一波人脑渲染 `**env`系的工具有: * [rbenv]( https://github.com/rbenv/rbenv) * [nodenv]( https://github.com/nodenv/nodenv) * [goenv]( https://github.com/syndbg/goenv), github 上名字叫 goenv 的好几个 (推荐使用[gvm]( https://github.com/moovweb/gvm)代替) * [jenv]( https://github.com/gcuisinier/jenv) (个人感觉还是用 homebrew/linuxbrew 安装后设定 JAVA_HOME 更方便直接) 个人感觉`**env`系的比`**vm`系的更好用。 | 
|  |      31gclove      2018-01-05 11:39:38 +08:00 能用 anaconda 就用 anaconda = = 只会用 conda 和 virtualenv | 
|  |      32okampfer      2018-01-05 11:43:24 +08:00 | 
|  |      33Muninn      2018-01-05 11:53:06 +08:00 python3.3 后就自带 pyvenv 了 从那以后我就懒得额外安装 virtualenv 了 | 
|      34alber1986      2018-01-05 11:54:10 +08:00 python 系列视频教程,学习的来看看 http://www.sucaihuo.com/video/172-0-0 | 
|  |      35ClutchBear      2018-01-05 12:13:00 +08:00 pyenv 安装 anaconda 速度慢的话,  可以去官网下载.sh 的安装脚本, 安装完后, 把 anaconda 目录拷贝到 .pyenv/versions 里面 在终端执行一次, pyenv rehash | 
|  |      37jowuIM      2018-01-05 12:30:41 +08:00 用过 pyenv 的基本功能,感觉并没有很优秀。 但是有的,用起来就如官方说的命令比较接近 node,也就是习惯 node 的人会比较喜欢 | 
|      38CodeDrift      2018-01-05 13:16:09 +08:00 推荐使用 pipenv 感觉不错~ | 
|  |      39yexiaoxing      2018-01-05 13:17:40 +08:00 via iPhone @korvin 你贴的科大的地址是清华 TUNA 的。科大是这个 http://mirrors.ustc.edu.cn/pypi/ | 
|  |      40korvin      2018-01-05 14:03:06 +08:00 | 
|      41fewtime      2018-01-05 18:44:15 +08:00 现在不是流行用 pipenv 吗 | 
|  |      42yexiaoxing      2018-01-05 21:10:39 +08:00 via iPhone @korvin 反正 tuna 和 ustclug 是一对好基友( | 
|  |      43korvin      2018-01-05 21:20:48 +08:00 | 
|  |      44vivisidea      2018-01-05 21:39:14 +08:00 不是直接 docker 走起么:D | 
|  |      45tcitry      2018-01-05 22:39:08 +08:00 还用 virtualenv 的原因是可以直接在项目里打开三方库查看源码。。 | 
|  |      46ChangHaoWei      2018-01-06 07:27:51 +08:00 pyenv , pyenv virtualenv,这不是可以一起用? @tcitry | 
|  |      47sunwei0325      2018-01-06 21:41:53 +08:00 我推荐 pipenv 和 virtualenvwrapper | 
|  |      48moogle      2018-01-07 09:48:57 +08:00 via iPhone pyenv , pyenv virtualenv 我一直搞不明白这两个区别在哪里,什么情况下用哪个? | 
|  |      49Seymer      2018-01-09 16:01:27 +08:00 Mac OS 下安装可能会报错:zipimport.ZipImportError: can't decompress data; zlib not available 目前找到的解决方案是: CFLAGS="-I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \ LDFLAGS="-L$(brew --prefix openssl)/lib" \ pyenv install -v 3.5.0 但是并没有实质性解决问题,安装其他版本仍需上面第一二行,不知道有没有其他方案? 参考链接: https://github.com/pyenv/pyenv/issues/451 https://github.com/pyenv/pyenv/issues/448 | 
|  |      50nlimpid      2018-01-11 10:05:12 +08:00 pyenv 我的理解是个 python 版本管理器,它的目的更多的是为了方便测试,比如代码在 2 和 3 的环境运行的结果。而后者其实独立多个项目的 python 环境的作用,每一个新的项目的环境(除了版本,更多的是依赖包)都是独立,并且现在应该都在推 pipenv。 @moogle | 
|  |      51xrlin      2018-02-27 16:05:21 +08:00 via iPhone  1 anaconda +1 | 
|  |      52Mark24      2020-04-08 16:30:13 +08:00 |