1. 首页
  2. Python

Simple Python Version Management: pyenv

什么是pyenv:
pyenv是一个forked自ruby社区的简单、低调、遵循UNIX哲学的Python环境管理工具, 它可以轻松切换全局解释器版本, 同时结合vitualenv插件可以方便的管理对应的包源。
 
为什么使用pyenv:
为了在同一系统环境中使用不同版本的python,在项目开发中保证不同的包环境互不干扰。
 

安装Pyenv:
1、安装git
yum -y install git
 
2、安装Python编译依赖
yum -y install gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
 
3、创建用户python
useradd python ; echo 123 |passwd python –stdin 
并且su到python用户下
 
4、使用python用户登录后安装Pyenv
Pyenv官网 https://github.com/pyenv/pyenv
Pyenv-installer插件 https://github.com/pyenv/pyenv-installer
下载的 pyenv-installer 是一个shell脚本,直接执行以下这条命令:
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
 
上面这条命令可能无法访问,可以这样解决:
用浏览器打开https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer,将看到的网页内容复制到服务器的脚本当中,然后本地执行: bash pyenv-installer
注意:
  1. 在 https://github.com/pyenv/pyenv-installer 有安装文档
  2. 如果curl出现 curl: (35) SSL connect error ,是nss版本低的问题,更新它。当前nss版本只有3.15。
可能需要配置一个有较新包的yum源:
[updates]
name=CentOS-Updates
baseurl=https://mirrors.aliyun.com/centos/6/os/x86_64/
gpgcheck=0
然后在更新nss : yum update nss ;也可以直接去阿里镜像下载repo文件后,更新。
 
5、安装会提示在python用户的~/.bash_profile中追加:
# Load pyenv automatically by adding
# the following to ~/.bashrc:
export PATH=”/home/python/.pyenv/bin:$PATH”
eval “$(pyenv init -)”
eval “$(pyenv virtualenv-init -)”
将上面3行内容写入当前用户的~/.bashrc或~/.bash_profile,我这里放到~/.bash_profile中,然后source,或者退出再重连一下都行。pyenv就可以使用了。
这样当python用户启动的时候,会执行用户的.bash_profile中的脚本,就会启动pyenv。
安装好的pyenv就在 ~/.pyenv 目录中。如果以后需要更新pyenv,可以使用 pyenv update 命令。
 

Pyenv的使用:
python -V | –version  #查看当前系统的python版本
echo $PATH             #查看当前系统的python路径
 

pyenv命令:
pyenv
pyenv 1.2.20
Usage: pyenv <command> [<args>]
Some useful pyenv commands are:
   activate    Activate virtual environment
   commands    List all available pyenv commands
   ……
 
install
pyenv help install
pyenv install –list | less  #查看pyenv各版本
pyenv install 3.6.9          #安置pyenv指定版本
pyenv versions               #查看所有python版本
使用上面的方式是连接官网下载指定版本,这样安装可能较慢,原因在于需要从外部下载指定版本文件到本地编译,为了加速,可是选用cache方法,使用缓存方式安装:
首先你可以在windows上下载需要待安装版本的软件包,然后mkdir -p /home/python/.pyenv/cache
https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz
https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz
在新建的cache目录中放入下载好的软件包后再执行安装命令,会使用缓存安装,而不是连接官网。
pyenv install 3.6.9 -vvv
pyenv install 3.7.7 -vvv
 
pyenv version    #当前python版本,system表示当前操作系统使用的版本
system (set by /home/python/.pyenv/version)
pyenv versions   #查看所有已经安装的版本,*星号表示当前版本
* system (set by /home/python/.pyenv/version)
  3.6.9
  3.7.7
 

pyenv的python版本控制:
global全局设置
#pyenv global xxx
python -V
Python 2.7.5
pyenv global 3.6.9       #执行之前python版本显示2.7.5,执行后重新加载显示变成了3.6.9
python -V
Python 3.6.9
pyenv global system      #记得改回来
可以看到所有受pyenv控制的窗口中都是3.6.9的python版本了。
这里用global是作用于非root用户python用户上,如果是root用户安装,请不要使用global,否则影响
更大。比如,这里使用的CentOS6.5就是Python2.6,CentOS7使用了2.7,使用了global就成了3.x,会
带来很不好的影响。建议不用。
 
shell 会话设置
影响只作用于当前shell会话
#pyenv shell xxx 。也不推荐。
python -V   —> Python 2.7.5
pyenv versions
* system (set by /home/python/.pyenv/version)
  3.6.9
  3.7.7
pyenv shell 3.6.9
python -V   —> Python 3.7.7
pyenv  versions
 system
 3.6.9
* 3.7.7 (set by PYENV_VERSION environment variable)
 
local 本地设置
使用pyenv local设置从当前工作目录开始向下递归都继承这个版本设置。推荐!
#pyenv local 3.6.9
#pyenv local –unset   #取消local设置
cd /home/python/projects/pro
pyenv local 3.7.7
python -V   —>  Python 3.7.7   #pyenv local 设置之后,pytho的版本也变成了3.7.7
cd  ; python -V    —> Python 2.7.5     
cd /home/python/projects/pro ; python -V   —>  Python 3.7.7  
##可以看到pyenv local设置仅仅只对设置当时所在目录有效,在其他目录环境下无效。
 
mkdir /home/python/projects/web ; cd /home/python/projects/web ; pyenv local 3.6.9
python -V   —-> Python 3.6.9
cd ; python -V    —-> Python 2.7.5
cd /home/python/projects/pro/ ; python -V  —-> Python 3.7.7
##看到没,这个就可以很好的做到各个目录python环境的隔离,以期在不同环境下开发部署不同项目。
 

Virtualenv 虚拟环境设置
为什么要使用虚拟环境?
因为刚才使用的Python环境都是一个公共的空间,如果多个项目使用不同Python版本开发,或者使用不同的Python版本部署运行,或者使用相同版本开发的不同项目使用了不同版本的库,等等这些问题都会带来冲突。最好的解决办法就是每一个项目独立运行自己的“独立小环境”中。
可使用插件,在plugins/pyenv-virtualenv中。命令格式:pyenv  virtualenv  版本号 虚拟空间名称
 
[python@k8s-node1 pro]$ pyenv virtualenv 3.6.9 w369
[python@k8s-node1 projects]$ pyenv virtualenv 3.7.7 wzstyle377
[python@k8s-node1 ~]$ pyenv virtualenv 3.6.9 style3-6-9
[python@k8s-node1 ~]$ pyenv versions
* system (set by /home/python/.pyenv/version)
  3.6.9
  3.6.9/envs/style3-6-9
  3.6.9/envs/w369
  3.7.7
  3.7.7/envs/wzstyle377
  style3-6-9
  w369
  wzstyle377
#这个时候看到已经多出了好几个虚拟版本,我们可以在不同目录下指定pyenv local版本,以解决一些冲突问题。
例如:
[python@k8s-node1 pro]$ pwd
/home/python/projects/pro
[python@k8s-node1 pro]$ pyenv versions
* 3.7.7 (set by /home/python/projects/pro/.python-version)
[python@k8s-node1 pro]$ python -V
Python 3.7.7
[python@k8s-node1 pro]$ pyenv local style3-6-9
(style3-6-9) [python@k8s-node1 pro]$ python -V
Python 3.6.9
(style3-6-9) [python@k8s-node1 pro]$ pyenv versions
* style3-6-9 (set by /home/python/projects/pro/.python-version)
[python@k8s-node1 ~]$ cd ; python -V ; pyenv versions
Python 2.7.5
* system (set by /home/python/.pyenv/version)
#可看到,使用了pyenv local 仍然只对pro目录有效。设置local之后,在对应目录下会产生一个version文件:
cat /home/python/projects/pro/.python-version   —>  style3-6-9  #这个文件里记录了使用的版本
 
#我们可以基于安装的3.6.9或者3.7.7使用virtualenv虚拟出多个不同的独立的空间,进行不同项目的操作,避免冲突和干扰。虚拟出来的独立空间和虚拟时指定的版本号是同一版本。
 
#虚拟出来的空间的目录在~/.pyenv/versions/下,以后只要使用一个虚拟版本,包就会安装到这些对应的目录下去,而不是使用3.6.9或3.7.7。
ls /home/python/.pyenv/versions    —>   3.6.9  3.7.7  style3-6-9  w369  wzstyle377
 

pip 通用配置
pip 是Python的包管理工具,3.x的版本直接带了,可直接使用。pip连接python官网使用速度较慢,为了使用国内镜像,可以做以下操作:
mkdir ~/.pip
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
配置完成之后,就可以使用阿里云下载了:
cd /home/python/projects/pro ;  pip install jupyter
Simple Python Version Management: pyenv
可根据提示升级pip: pip install –upgrade pip
pip -V  #查看pip版本
#并且,我们是用local指定了/home/python/projects/pro目录环情况下安装的jupyter,可和他们目录做对比:
(style3-6-9) [python@k8s-node1 pro]$ l. | cat .python-version      —–>     style3-6-9
(style3-6-9) [python@k8s-node1 pro]$ pip list     #会打印出jupyter各种包
(w369) [python@k8s-node1 web]$ cd /home/python/projects/web | pip -V ; pip list ; l. |cat .python-version
在w369这个虚拟环境下看到pip版本是18.1,没有关于jupyter的包,看到version文件里版本是w369;这就可以验证,即使是通过3.6.9这个相同版本虚拟出来的不同的环境空间,是各自独立,互不影响冲突的。
 
使用jupyter,在/home/python/projects/pro执行:jupyter notebook –ip=0.0.0.0(允许所有地址访问),程序启动后会监听8888端口,复制程序输出的token在浏览器进行访问:(jupyter只在这个pro这个目录中运行)
http://172.20.10.6:8888/?token=bebf93d571fff95a68e7dd1ec5a1ed8fc44c5bb71c51c4e7  #注意ip地址要改
 

导出包
虚拟环境的好处就在于和其他项目运行环境隔离。每一个独立的环境都可以使用pip命令导出已经安装的包,在另一个环境中安装这些包。
建议一般开发用什么版本,部署的时候用同样的版本。
例如是在pycharm开发的项目,其版本环境可以在pycharm的Terminal中通过pip freeze来查看已经安装的包,通过pip freeze  > requirements 导出名为requirements的文件,这个文件会自动出现在pycharm左边Project中,我们可以查看到它的在windows电脑中的路径,并将其传输到需要的linux运行环境中,为了让linux运行环境和开发环境相同,执行 pip install -r requirements  会将requirements文件中的包全部下载到当前linux运行环境,到达开发和运行部署环境一致的目的。

原创文章,作者:wz,如若转载,请注明出处:https://www.wzstyle.cn/678.html

发表评论

邮箱地址不会被公开。 必填项已用*标注