为python版本抓狂,试下pyenv吧
写python时,最烦的事莫过于版本切换。python3已经很成熟了,但很多生产项目依然用的是2.7版本,本地环境经常需要切换版本。此外,不同项目的依赖也不同,有时还会造成冲突。这些杂七杂八的问题让初学者很烦躁,pyenv正是解决此类问题的神器。
简单地说,pyenv是python的版本管理工具。能实现如下功能:
-
安装多个不同版本的python,且彼此独立
-
便捷地切换版本,可以设置为全局切换,也可以设置某个目录为特定的版本
安装pyenv
以macos为例:
☁ ~ brew install pyenv
☁ ~ pyenv --version
pyenv 1.2.7
初始化pyenv
☁ ~ pyenv init
# Load pyenv automatically by appending
# the following to ~/.zshrc:
eval "$(pyenv init -)"
根据提示,将初始化指令追加到~/.zshrc
中(不同的shell配置文件不同)
☁ ~ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
查看有哪些可安装的版本
☁ ~ pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
2.4
2.4.1
2.4.2
2.4.3
# ...
可用的版本极多,假设我们想要安装3.6系列的版本,可以用grep进行筛选
☁ ~ pyenv install --list | grep 3.6
3.3.6
3.6.0
3.6-dev
3.6.1
3.6.2
3.6.3
3.6.4
3.6.5
3.6.6
activepython-3.6.0
接下来我们选择用3.6.6版本, 安装的命令很简单:
pyenv install 3.6.6
但你会发现下载安装包的速度极其慢,基于众所周知的原因,直接下载国外源是不可行的。因此需要用以下的国内特色下载方式:
- 根据你要下载的版本号,拼接url
https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz
-
用迅雷或其它下载工具下载
-
将安装包放到以下目录
☁ ~ mv ~/Downloads/Python-3.6.6.tar.xz ~/.pyenv/cache
- 执行安装指令
☁ ~ pyenv install 3.6.6
python-build: use openssl from homebrew
python-build: use readline from homebrew
Installing Python-3.6.6...
python-build: use readline from homebrew
Installed Python-3.6.6 to /Users/senlongzhong/.pyenv/versions/3.6.6
- 验证安装
查看已安装的版本
☁ ~ pyenv versions
system
3.6.6
版本切换
全局切换
将3.6.6设置为全局使用的版本
☁ ~ pyenv global 3.6.6
☁ ~ pyenv versions
system
* 3.6.6 (set by /Users/senlongzhong/.pyenv/version)
重启shell, 执行python即可看到已经切换成了3.6.6版本
☁ ~ python
Python 3.6.6 (default, Sep 5 2018, 08:57:22)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
局部切换
除了全局使用,还可以针对某个目录选择特定的版本
按前面的方式安装2.7.14版本
☁ ~ pyenv versions
system
2.7.14
* 3.6.6 (set by /Users/long/.pyenv/version)
指定目录切换成2.7.14版本
☁ python mkdir python2.7
☁ python cd python2.7
☁ python2.7 pyenv local 2.7.14 # 将python2.7目录设置为2.7.14版本
☁ python2.7 python
Python 2.7.14 (default, Sep 5 2018, 09:12:27)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
☁ python2.7 cd ..
☁ python python # 其他目录依然使用3.6.6版本
Python 3.6.6 (default, Sep 5 2018, 08:57:22)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
删除版本
☁ ~ pyenv uninstall 3.6.6
pyenv-virtualenv
pyenv已经很强大了,但还不够,如果我们希望每个项目的依赖都是独立的,而不是全部安装在同一版本的python中
就需要用到 pyenv-virtualenv
pyenv-virtualenv是pyenv的一个插件,用于创建指定版本的虚拟环境, github源码
安装
☁ ~ brew install pyenv-virtualenv
☁ ~ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
创建虚拟环境
☁ ~ pyenv virtualenv 2.7.14 my-virtual-env-2.7.14
查看现有的虚拟环境
☁ ~ pyenv virtualenvs
2.7.14/envs/my-virtual-env-2.7.14 (created from /Users/long/.pyenv/versions/2.7.14)
my-virtual-env-2.7.14 (created from /Users/long/.pyenv/versions/2.7.14)
启用虚拟环境
☁ ~ pyenv activate my-virtual-env-2.7.14
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(my-virtual-env-2.7.14) ☁ ~ python
Python 2.7.14 (default, Sep 5 2018, 09:12:27)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
virtualenv
退出虚拟环境
(my-virtual-env-2.7.14) ☁ ~ pyenv deactivate
☁ ~ python
Python 3.6.6 (default, Sep 5 2018, 08:57:22)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
删除虚拟环境
最简单粗暴的方式即可:
☁ ~ rm -rf ~/.pyenv/versions/my-virtual-env-2.7.14
小结
pyenv用于管理版本,pyenv-virtualenv用于管理指定版本的虚拟环境。强烈推荐在开发中结合两者来使用,让各个项目独立运行,不会互相干扰。