背景:
本来我是用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安装请参考这篇文章。Linux安装请参考下面。
1.通过Brew安装和激活环境
#安装
brew install pyenv pyenv-virtualenv
然后用户profile添加如下内容,然后source之使其生效:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/shims:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
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 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 版本的最新信息
还有一个命令可以修改全局python版本,但是不推荐:
pyenv global version:(不推荐
)设置默认全局Python版本,可能会搞乱系统依赖
如果误使用了这个命令,可以使用
pyenv global system
来恢复使用系统默认的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安装(以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
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
然后profile文件中添加如下内容
(注意:不要按照pyenv安装完成后的提示来做,那样是无法激活虚拟环境的!)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
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
或者在profile文件中
export PYTHON_BUILD_MIRROR_URL="https://registry.npmmirror.com/-/binary/python"
export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1
这样安装就自动从国内下载了
参考文献:
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