天天看点

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

背景:

本来我是用

brew switch python xxxx

+

virtualenv

+

virtualenvwrapper

来管理版本的。但是由于更早之前对于版本管理没有概念,导致系统有些混乱。除了系统自带的python 2.7.17之外,还有homebrew安装的[email protected] (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安装请参考这篇文章。Linux安装请参考下面。

1.通过Brew安装和激活环境

#安装
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安装(以wsl的Ubuntu为例)

有更简单的方法(注意~/.bashrc修改为你对应的profile):

sudo apt-get update
sudo apt-get install python-pip git make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev


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

参考文献:

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