使用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安装请参考这篇文章。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:

  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

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 

参考文献:
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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: pyenv是一种Python版本管理工具,可以用来改变全局的Python版本,安装多个版本Python,设置目录级别的Python版本,以及创建和管理虚拟环境。通过pyenv,可以实现对不同版本Python进行管理,并且可以通过virtualenv设置不同的虚拟环境Python库的版本进行管理。这样,在程序运行的过程中,可以根据不同的运行需求使用不同的Python版本。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Python版本管理-pyenv](https://blog.csdn.net/peng78585/article/details/131767881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用pyenv管理python版本](https://blog.csdn.net/Zhangsan0219/article/details/121237529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python版本管理工具之pyenv](https://blog.csdn.net/YiJie__ShuSheng/article/details/90448944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值