pyenv
介绍
pyenv
是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源。
为什么我们需要pyenv
呢
Python解释器版本混乱, 2和3差别巨大, 而且细分版本也不尽相同, 难以选择和管理.
不同Linux发行版自带Python不同, 如ubuntu16自带2.7和3.5版本, 其中系统许多组件依赖于自带解释器, 一旦删除或者更改都可能会造成系统出问题.
不同的Python解释器软件包管理也是问题, 如pip和ipython等必备包组件, 而且在项目开发中如何保证不同的包环境互不干扰也是一个问题.
准备工作
本次我在CentOS 7.9下安装pyenv
,在安装之前需要先进行一些准备工作
yum -y install git curl wget yum -y install gcc make patch gdbm-devel openssl-devel # Python编译需要的工具包 yum -y install sqlite-devel readline-devel zlib-devel bzip2-devel
pyenv是源代码编译安装Python解释器,所以一定要安装gcc等依赖
如果想更加安全的话可以新建一个普通用户
并切换过去再进行后续操作
useradd -r python -m echo '1' |passwd --stdin python su - python
安装pyenv
在GitHub项目地址有多种操作系统安装方式(包括MacOS,Windows等),本次我使用的是CentOS来进行安装
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash # 或 curl -L https://github.com/pyenv/pyenv-installer/blob/master/bin/pyenv-installer
脚本本质上是去github进行克隆,如果这一步都失败了,那么其实是安装不上的,因此可以将这个脚本github修改为gitee,当然如果你可以上GitHub那可以直接忽略这一步
当你无法访问GitHub的话:
#!/usr/bin/env bash set -e [ -n "$PYENV_DEBUG" ] && set -x if [ -z "$PYENV_ROOT" ]; then export PYENV_ROOT="${HOME}/.pyenv" fi colorize() { if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2" else echo -n "$2" fi } # Checks for `.pyenv` file, and suggests to remove it for installing if [ -d "${PYENV_ROOT}" ]; then { echo colorize 1 "WARNING" echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first." echo } >&2 exit 1 fi failed_checkout() { echo "Failed to git clone $1" exit -1 } checkout() { [ -d "$2" ] || git clone --depth 1 "$1" "$2" || failed_checkout "$1" } 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 GITHUB="https://gitee.com" checkout "${GITHUB}/ibuki_fuuko/pyenv.git" "${PYENV_ROOT}" checkout "${GITHUB}/codeseth/pyenv-doctor.git" "${PYENV_ROOT}/plugins/pyenv-doctor" checkout "${GITHUB}/yuebanlaosiji/pyenv-installer.git" "${PYENV_ROOT}/plugins/pyenv-installer" checkout "${GITHUB}/codeseth/pyenv-update.git" "${PYENV_ROOT}/plugins/pyenv-update" checkout "${GITHUB}/unicode233/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv" checkout "${GITHUB}/mouday/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 { # Without args, `init` commands print installation help "${PYENV_ROOT}/bin/pyenv" init || true "${PYENV_ROOT}/bin/pyenv" virtualenv-init || true } >&2 fi
拷贝代码至文件pyenv_install.sh
中
bash pyenv_install.sh
执行完成之后有如下输出
这里就提示我们设置环境变量了
cat >> ~/.bashrc <<EOF export PYENV_ROOT="\$HOME/.pyenv" export PATH="/home/python/.pyenv/bin:\$PATH" eval "\$(pyenv init --path)" eval "\$(pyenv init -)" eval "\$(pyenv virtualenv-init -)" EOF # \是用来转义$的,如果是直接打开.bashrc进行修改的话需要去掉\ source ~/.bashrc
安装python多版本
pyenv install -l # 列出可安装的版本,会输出很多 # 等价于 pyenv install --list pyenv install 3.6.9 -vvv # -vvv是打印详细信息,也可不加 pyenv install 3.7.7
安装的版本会在~/.pyenv/versions
目录下。
对于比较大的版本文件,例如anaconda
,可以先到官网下载,然后将文件放在~/.pyenv/cache
目录下,再执行安装命令时,pyenv不会重复下载。
$ ls .pyenv/versions/ 3.6.9 3.7.7
如果要卸载的话就是将install
修改为uninstall
也可以直接打印已安装的版本
$ pyenv version # 打印当前使用版本 $ pyenv versions # 打印所有已安装版本,*星号表示当前版本
设置虚拟环境
由于不同项目,或使用不同Python版本,或使用同版本Python但使用不同版本库,很难将它们部署在一
起,所以,应该使用不同的虚拟环境隔离部署。
使用pyenv local 命令建立一个目录和一个Python版本或虚拟版本之间的关系,该目录的子孙目录默认
也继承这个版本。
设置一个python3.6.9的虚拟环境
[python@k82 ~]$ mkdir -p projects/test369 # 新建一个目录,以后在这个目录下的python环境为3.6.9 [python@k82 ~]$ cd projects/test369/ [python@k82 test369]$ pyenv virtualenv 3.6.9 py369 # 设置py369的python版本为python3.6.9 [python@k82 test369]$ pyenv local py369 # 设置当前目录的python本地版本为py369 (py369) [python@k82 test369]$ python -V Python 3.6.9 (py369) [python@k82 test369]$ pyenv version py369 (set by /home/python/projects/test369/.python-version)
同理设置一个python3.7.7的虚拟环境
[python@k82 ~]$ mkdir -p projects/test377 [python@k82 ~]$ cd projects/test377/ [python@k82 test377]$ pyenv virtualenv 3.7.7 py377 [python@k82 test377]$ pyenv local py377 (py377) [python@k82 test377]$ python -V Python 3.7.7 (py377) [python@k82 test377]$ pyenv version py377 (set by /home/python/projects/test377/.python-version)
但是此时全局的python版本并未发生改变
[python@k82 ~]$ pwd /home/python [python@k82 ~]$ python -V Python 2.7.5 [python@k82 ~]$ pyenv version system (set by /home/python/.pyenv/version) [python@k82 ~]$ pyenv versions * system (set by /home/python/.pyenv/version) 3.6.9 3.6.9/envs/py369 3.7.7 3.7.7/envs/py377 py369 py377