背景:
本来我是用brew switch python xxxx
+virtualenv
+virtualenvwrapper
来管理版本的。但是由于更早之前对于版本管理没有概念,导致系统有些混乱。除了系统自带的python 2.7.17之外,还有homebrew安装的python@2 (2.7.17)/3.6.5_1/3.7.6_1。 最终出了一点小问题,那就是virtualenvwrapper
创建虚拟环境后,虽然python -V
和pip install
都OK,但是python-config
命令还是没有正常切换,而是连接到了/usr/local/bin/python-config
上面,而这个又连接到了系统的/usr/bin/python-config
上面,不论怎么运行python-config --config-dir
都会提示Usage: /usr/local/bin/python-config [--prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--help]
的python上面,python2-config
和python3-config
都能正常运行。而恰好我的系统自带的python-config
命令出了问题,不能正确执行。
猜想:在某些需要python-config的场景下(比如cmake编译),可以使用
--with-python-config-dir=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config
来绕过这个错误?
好吧言归正传。首先pyenv
可以管理和切换系统全局和局部python版本,pyenv-virtualenv
管理虚拟环境。它们可以从Homebrew安装,也可以从git仓库克隆安装,本文只涉及Hombrew安装,git安装请参考这篇文章。
1.安装和激活环境
#安装
brew install pyenv pyenv-virtualenv
然后用户profile添加如下内容,然后source之使其生效:
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
2. pyenv常用命令
pyenv versions #列出所有被 pyenv 管理的 python 版本,当前使用的版本前会用 * 标出
pyenv install --list # 列出可安装版本
pyenv install <version> # 安装对应版本
pyenv install -v <version> # 安装对应版本,若发生错误,可以显示详细的错误信息
pyenv uninstall [-f|--force] <version> #卸载某个版本的 python,-f|--force 选项的作用是强制删除某版本的 python,不需要确认,如果该版本不存在,也不会给出错误信息。
pyenv which python # 显示当前python安装路径
pyenv global <version> # (不推荐)设置默认Python版本,可能会搞乱系统依赖
pyenv local <version> # 当前路径创建一个.python-version, 以后进入这个目录自动切换为该版本(我更推荐使用pyen-virtualenv管理版本)
pyenv local --unset #取消设置当前目录的 python 版本
pyenv shell <version> # 当前shell的session中启用某版本,优先级高于global 及 local
pyenv shell --unset #取消设置当前 shell 的 python 版本
pyenv shell #显示当前 shell 使用的 python 版本
export PYENV_VERSION=<version> #设置环境变量 PYENV_VERSION 的值为指定版本,也可以直接设定环境变量 PYENV_VERSION 的值,效果一样
pyenv rehash #更新目录 shims 的内容,以使 pyenv 知道它所管理的 python 版本的最新信息
3. 使 pyenv 暂时失效
注释掉profile里面的这两句:eval "$(pyenv init -)"
和eval "$(pyenv virtualenv-init -)"
。重新source profile或者重新打开terminal即可。
4. pyenv-virtualenv常用命令
pyenv virtualenv env # 从默认版本创建虚拟环境env
pyenv virtualenv 3.6.10 py3cv4 # 创建3.6.4版本的虚拟环境,名称为py3cv4
pyenv virtualenv --system-site-packages py3cv4 #从默认版本创建虚拟环境py3cv4,并且继承系统的site-packages
pyenv activate py3cv4 # 激活 py3cv4 这个虚拟环境
pyenv deactivate # 停用当前的虚拟环境
pyenv uninstall py3cv4 # 删除 py3cv4 这个虚拟环境
5. 自动激活虚拟环境
# 可以配合pyenv local 实现自动激活虚拟环境
# 比如在 ~/opencv/目录下,我希望进入这个目录就自动激活`py3cv4`这个虚拟环境
#自动激活虚拟环境
pyenv local py3cv4 #在希望自动激活此虚拟环境的目录下执行
#取消当前目录自动激活虚拟环境
pyenv local --unset
折腾完这个之后。我终于可以和系统的python说再见了。
Tips:
PYENV_DEBUG=1
参数可以看到更多信息用于debug:PYENV_DEBUG=1 pyenv virtualenv --system-site-packages sandbox
- 你可能会在进入pyenv虚拟环境的时候看到这个提示:
yenv-virtualenv: prompt changing will be removed from future release. configure export PYENV_VIRTUALENV_DISABLE_PROMPT=1 to simulate the behavior.
具体讨论看这里,如果未来这个虚拟环境提示符真的会被取消,可以通过这个命令找回来export PS1='($(pyenv version-name)) '$PS1
如果你是从linux安装
有更简单的方法(注意~/.bashrc修改为你对应的profile):
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
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
git clone https://github.com/pyenv/pyenv-virtualenv.git $PYENV_ROOT/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
pyenv安装python版本下载太慢?
使用如下命令用国内源下载pyenv对应python版本:
其中v=3.7.3
代表版本号为3.7.3
v=3.7.3;wget https://npm.taobao.org/mirrors/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v
参考文献:
python虚拟环境管理:pyvenv、pyenv、virtualenv
pyenv 安装及常用命令
Common build problems · pyenv/pyenv Wiki
pyenv 安装配置与国内镜像加速 结合 virtualenv
pyenv/pyenv: Simple Python version management
pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)
Common build problems · pyenv/pyenv Wiki