python版本切換和虛擬運(yùn)行環(huán)境-pyenv, virtualenv

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

經(jīng)常遇到這樣的情況:

  • 系統(tǒng)自帶的 Python 是 2.6掺涛,自己需要 Python 2.7 中的某些特性遍愿;
  • 系統(tǒng)自帶的 Python 是 2.x居夹,自己需要 Python 3.x嚎京;

此時(shí)需要在系統(tǒng)中安裝多個(gè) Python诚隙,但又不能影響系統(tǒng)自帶的 Python既穆,即需要實(shí)現(xiàn) Python 的多版本共存赎懦。pyenv 就是這樣一個(gè) Python 版本管理器。
pyenv用于在一臺(tái)機(jī)器上安裝多個(gè)版本的python環(huán)境幻工, 并提供方便的切換方法励两。
我們可以用pyenv 安裝多個(gè)版本python , 比如2.6, 2.7, 3.3 三個(gè)版本。 用戶(hù)可以隨意切換當(dāng)前默認(rèn)的python版本囊颅,且不影響系統(tǒng)的python版本当悔。

virtualenv是python虛擬運(yùn)行環(huán)境管理和切換工具

pyenv可以安裝多個(gè)版本的python,但每個(gè)版本的運(yùn)行環(huán)境仍是唯一的踢代, 如果我們想在環(huán)境中安裝一些包/模塊的話(huà)先鱼, 會(huì)導(dǎo)致這個(gè)版本的運(yùn)行環(huán)境被修改,當(dāng)多人或多個(gè)項(xiàng)目共用同一python版本時(shí)奸鬓,可能會(huì)有包沖突問(wèn)題焙畔。 例如:項(xiàng)目A需要jinja 2.7,而項(xiàng)目B需要jinja 2.6怎么辦串远?
virtualenv可以搭建虛擬且獨(dú)立的python運(yùn)行環(huán)境(原理很簡(jiǎn)單宏多,就是把系統(tǒng)python或者pyenv安裝的python復(fù)制一份到virtualenv的環(huán)境,用命令source venv/bin/activate進(jìn)入一個(gè)virtualenv環(huán)境時(shí)澡罚,virtualenv會(huì)修改相關(guān)環(huán)境變量伸但,讓命令python和pip均指向當(dāng)前的virtualenv環(huán)境),可以使每個(gè)項(xiàng)目庫(kù)環(huán)境與其他項(xiàng)目獨(dú)立開(kāi)來(lái)留搔,保持環(huán)境的干凈更胖,解決包沖突問(wèn)題。
pyenv的插件pyenv-virtualenv使得我們可在pyenv下直接使用virtualenv,最終滿(mǎn)足創(chuàng)建任意python版本下任意獨(dú)立環(huán)境的需求却妨。

安裝pyenv和pyenv-virtualenv插件

雖然直接安裝pip安裝virtualenv也行饵逐,但是通過(guò)pyenv插件的形式安裝virtualenv的虛擬環(huán)境更加方便,因?yàn)橹蟮牟僮鲿?huì)比較方便彪标。
方法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捞烟,然后按提示把環(huán)境變量修改加入/.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設(shè)置環(huán)境變量:

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

使用

初始化虛擬環(huán)境

初始化環(huán)境:

source ~/.bash_profile

查看已安裝的 python 版本和當(dāng)前版本(默認(rèn)是system版本;virtualenv生成的虛擬運(yùn)行環(huán)境也是用一個(gè)版本表示的题画,但是system不是一個(gè)虛擬環(huán)境)

$ pyenv versions

查看可以安裝的python版本

$ pyenv install --list

安裝編譯python的依賴(lài)庫(kù)

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

執(zhí)行上面命令后,會(huì)從給定的網(wǎng)址中下載安裝文件Python-2.7.12.tar.xz苍息。但由于文件很大廓奕,下載需要很久。建議做法是:先執(zhí)行以上命令然后馬上中斷安裝档叔,這樣就知道 pyenv 要下載的文件的鏈接桌粉。然后用戶(hù)自己用其他更快的方式(比如wget、迅雷等等)從該鏈接中下載安裝文件(最好選擇鏡像對(duì)應(yīng)地址下載, 例如:http://mirrors.sohu.com/python/)衙四,并將安裝文件移動(dòng)到 ~/.pyenv/cache 目錄下(該目錄默認(rèn)不存在铃肯,用戶(hù)要自行新建),再執(zhí)行上面的命令传蹈。編譯安裝本身也需要較長(zhǎng)時(shí)間押逼。默認(rèn)安裝路徑是~/.pyenv/versions/2.7.12/

檢查、安裝虛擬運(yùn)行環(huán)境:

查看現(xiàn)有虛擬運(yùn)行環(huán)境: pyenv versions惦界,會(huì)列出所有版本挑格,其中包括了虛擬運(yùn)行環(huán)境的虛擬版本
新建虛擬運(yùn)行環(huán)境(初次執(zhí)行會(huì)安裝virtualenv): pyenv virtualenv 2.7.12 env.1
激活虛擬運(yùn)行環(huán)境: 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
更新數(shù)據(jù)庫(kù), 在安裝 Python 或者其他帶有可執(zhí)行文件的模塊之后沾歪,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新::
pyenv rehash

執(zhí)行上面命令后漂彤,虛擬運(yùn)行環(huán)境會(huì)新建目錄: ~/.pyenv/versions/2.7.12/envs/env.1(此目錄下有bin,include和lib文件夾), 同時(shí)生成軟連~/.pyenv/versions/env.1指向此目錄,運(yùn)行pyenv versions命令灾搏,可以顯示出2.7.12/envs/env.1和env.1兩個(gè)版本挫望。第三方包安裝在/.pyenv/versions/2.7.12/envs/env.1/lib/python2.7/site-packages/下面。

切換虛擬環(huán)境

初始化環(huán)境:source ~/.bash_profile
激活環(huán)境: pyenv activate env.1
使用此虛擬環(huán)境的python: python my_task.py

退出虛擬環(huán)境

pyenv deactivate

刪除虛擬環(huán)境

pyenv uninstall env.1

其他功能

pyenv uninstall 卸載某個(gè)版本
pyenv update 更新 pyenv 及其插件

參考

Python 多版本共存之 pyenv
使用pyenv和virtualenv搭建python虛擬環(huán)境
Python多版本切換工具-Pyenv\virtualenv及Anaconda科學(xué)計(jì)算環(huán)境的配置
pyenv本地安裝python

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狂窑,一起剝皮案震驚了整個(gè)濱河市媳板,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泉哈,老刑警劉巖蛉幸,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破讨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奕纫,警方通過(guò)查閱死者的電腦和手機(jī)提陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)若锁,“玉大人搁骑,你說(shuō)我怎么就攤上這事斧吐∮止蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵煤率,是天一觀的道長(zhǎng)仰冠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝶糯,這世上最難降的妖魔是什么洋只? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昼捍,結(jié)果婚禮上识虚,老公的妹妹穿的比我還像新娘。我一直安慰自己妒茬,他們只是感情好担锤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乍钻,像睡著了一般肛循。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上银择,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天多糠,我揣著相機(jī)與錄音,去河邊找鬼浩考。 笑死夹孔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析孽。 我是一名探鬼主播析蝴,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绿淋!你這毒婦竟也來(lái)了闷畸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吞滞,失蹤者是張志新(化名)和其女友劉穎佑菩,沒(méi)想到半個(gè)月后盾沫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殿漠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年赴精,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绞幌。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕾哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莲蜘,到底是詐尸還是另有隱情谭确,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布票渠,位于F島的核電站逐哈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏问顷。R本人自食惡果不足惜昂秃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杜窄。 院中可真熱鬧肠骆,春花似錦、人聲如沸塞耕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荷科。三九已至唯咬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畏浆,已是汗流浹背胆胰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刻获,地道東北人蜀涨。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝎毡,于是被迫代替她去往敵國(guó)和親厚柳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容