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