python版本切换和虚拟运行环境-pyenv, virtualenv

pyenv是python版本管理和切换工具

经常遇到这样的情况:

  • 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性;
  • 系统自带的 Python 是 2.x,自己需要 Python 3.x;

此时需要在系统中安装多个 Python,但又不能影响系统自带的 Python,即需要实现 Python 的多版本共存。pyenv 就是这样一个 Python 版本管理器。
pyenv用于在一台机器上安装多个版本的python环境, 并提供方便的切换方法。
我们可以用pyenv 安装多个版本python , 比如2.6, 2.7, 3.3 三个版本。 用户可以随意切换当前默认的python版本,且不影响系统的python版本。

virtualenv是python虚拟运行环境管理和切换工具

pyenv可以安装多个版本的python,但每个版本的运行环境仍是唯一的, 如果我们想在环境中安装一些包/模块的话, 会导致这个版本的运行环境被修改,当多人或多个项目共用同一python版本时,可能会有包冲突问题。 例如:项目A需要jinja 2.7,而项目B需要jinja 2.6怎么办?
virtualenv可以搭建虚拟且独立的python运行环境(原理很简单,就是把系统python或者pyenv安装的python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境),可以使每个项目库环境与其他项目独立开来,保持环境的干净,解决包冲突问题。
pyenv的插件pyenv-virtualenv使得我们可在pyenv下直接使用virtualenv,最终满足创建任意python版本下任意独立环境的需求。

安装pyenv和pyenv-virtualenv插件

虽然直接安装pip安装virtualenv也行,但是通过pyenv插件的形式安装virtualenv的虚拟环境更加方便,因为之后的操作会比较方便。
方法1:
直接用pyenv-installer脚本安装到~/.pyenv/下

$ curl -o pyenv-installer.sh -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer
$ bash pyenv-installer.sh

方法2: 用如下修改后的pyenv-installer脚本安装,唯一不同是指定了安装路径/data/yourname/.pyenv/,并软连到/.pyenv,然后按提示把环境变量修改加入/.bash_profile ,然后重启终端就可以了:

#!/usr/bin/env bash
set -e
[ -n "$PYENV_DEBUG" ] && set -x
if [ -z "$PYENV_ROOT" ]; then
  PYENV_ROOT="/data/`whoami`/.pyenv"
fi
ln -s $PYENV_ROOT ~/
shell="$1"
if [ -z "$shell" ]; then
  shell="$(ps c -p "$PPID" -o 'ucomm=' 2>/dev/null || true)"
  shell="${shell##-}"
  shell="${shell%% *}"
  shell="$(basename "${shell:-$SHELL}")"
fi
colorize() {
  if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"
  else echo -n "$2"
  fi
}
checkout() {
  [ -d "$2" ] || git clone --depth 1 "$1" "$2"
}
if ! command -v git 1>/dev/null 2>&1; then
  echo "pyenv: Git is not installed, can't continue." >&2
  exit 1
fi
if [ -n "${USE_GIT_URI}" ]; then
  GITHUB="git://github.com"
else
  GITHUB="https://github.com"
fi
checkout "${GITHUB}/yyuu/pyenv.git"            "${PYENV_ROOT}"
checkout "${GITHUB}/yyuu/pyenv-doctor.git"     "${PYENV_ROOT}/plugins/pyenv-doctor"
checkout "${GITHUB}/yyuu/pyenv-installer.git"  "${PYENV_ROOT}/plugins/pyenv-installer"
checkout "${GITHUB}/yyuu/pyenv-update.git"     "${PYENV_ROOT}/plugins/pyenv-update"
checkout "${GITHUB}/yyuu/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv"
checkout "${GITHUB}/yyuu/pyenv-which-ext.git"  "${PYENV_ROOT}/plugins/pyenv-which-ext"
if ! command -v pyenv 1>/dev/null; then
  { echo
    colorize 1 "WARNING"
    echo ": seems you still have not added 'pyenv' to the load path."
    echo
  } >&2
  case "$shell" in
  bash )
    profile="~/.bash_profile"
    ;;
  zsh )
    profile="~/.zshrc"
    ;;
  ksh )
    profile="~/.profile"
    ;;
  fish )
    profile="~/.config/fish/config.fish"
    ;;
  * )
    profile="your profile"
    ;;
  esac
  { echo "# Load pyenv automatically by adding"
    echo "# the following to ${profile}:"
    echo
    case "$shell" in
    fish )
      echo "set -x PATH \"${PYENV_ROOT}/bin\" \$PATH"
      echo 'status --is-interactive; and . (pyenv init -|psub)'
      echo 'status --is-interactive; and . (pyenv virtualenv-init -|psub)'
      ;;
    * )
      echo "export PATH=\"${PYENV_ROOT}/bin:\$PATH\""
      echo "eval \"\$(pyenv init -)\""
      echo "eval \"\$(pyenv virtualenv-init -)\""
      ;;
    esac
  } >&2
fi

在.bashrc或.bash_profile设置环境变量:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"   # 这句可以不加

使用

初始化虚拟环境

初始化环境:

source ~/.bash_profile

查看已安装的 python 版本和当前版本(默认是system版本;virtualenv生成的虚拟运行环境也是用一个版本表示的,但是system不是一个虚拟环境)

$ pyenv versions

查看可以安装的python版本

$ pyenv install --list

安装编译python的依赖库

CentOS/RHEL/Fedora:
sudo yum install readline readline-devel readline-static
sudo yum install openssl openssl-devel openssl-static
sudo yum install sqlite-devel
sudo yum install bzip2-devel bzip2-libs

Ubuntu:
sudo apt-get update
sudo apt-get install make build-essential libssl-dev zlib1g-dev
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget curl
sudo apt-get install llvm libncurses5-dev libncursesw5-dev

安装指定python版本,采用的是编译安装方式

pyenv install 2.7.12 -s

执行上面命令后,会从给定的网址中下载安装文件Python-2.7.12.tar.xz。但由于文件很大,下载需要很久。建议做法是:先执行以上命令然后马上中断安装,这样就知道 pyenv 要下载的文件的链接。然后用户自己用其他更快的方式(比如wget、迅雷等等)从该链接中下载安装文件(最好选择镜像对应地址下载, 例如:http://mirrors.sohu.com/python/),并将安装文件移动到 ~/.pyenv/cache 目录下(该目录默认不存在,用户要自行新建),再执行上面的命令。编译安装本身也需要较长时间。默认安装路径是~/.pyenv/versions/2.7.12/

检查、安装虚拟运行环境:

查看现有虚拟运行环境: pyenv versions,会列出所有版本,其中包括了虚拟运行环境的虚拟版本
新建虚拟运行环境(初次执行会安装virtualenv): pyenv virtualenv 2.7.12 env.1
激活虚拟运行环境: pyenv activate env.1
安装自己需要的第三方包:
pip install -r $ABSOLUTE_PATH/$PUBLIC_REQUIREMENTS_FILE
pip install -r $ABSOLUTE_PATH/$PRIVATE_REQUIREMENTS_FILE --no-cache-dir --no-index -f $PIPPACK_DIR
更新数据库, 在安装 Python 或者其他带有可执行文件的模块之后,需要对数据库进行更新::
pyenv rehash

执行上面命令后,虚拟运行环境会新建目录: ~/.pyenv/versions/2.7.12/envs/env.1(此目录下有bin,include和lib文件夹), 同时生成软连~/.pyenv/versions/env.1指向此目录,运行pyenv versions命令,可以显示出2.7.12/envs/env.1和env.1两个版本。第三方包安装在/.pyenv/versions/2.7.12/envs/env.1/lib/python2.7/site-packages/下面。

切换虚拟环境

初始化环境:source ~/.bash_profile
激活环境: pyenv activate env.1
使用此虚拟环境的python: python my_task.py

退出虚拟环境

pyenv deactivate

删除虚拟环境

pyenv uninstall env.1

其他功能

pyenv uninstall 卸载某个版本
pyenv update 更新 pyenv 及其插件

参考

Python 多版本共存之 pyenv
使用pyenv和virtualenv搭建python虚拟环境
Python多版本切换工具-Pyenv\virtualenv及Anaconda科学计算环境的配置
pyenv本地安装python

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容