使用pyenv和pyenv-virtualenv管理python 版本

背景:
本来我是用 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 -Vpip 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-configpython3-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:

  1. PYENV_DEBUG=1参数可以看到更多信息用于debug: PYENV_DEBUG=1 pyenv virtualenv --system-site-packages sandbox
  2. 你可能会在进入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

发布了227 篇原创文章 · 获赞 148 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/toopoo/article/details/104746623
今日推荐