Python版本管理工具之Pyenv的安装和使用

2019-09-02 0 条评论 550 次阅读 0 人点赞

Python开发中会遇到使用不同版本及开发环境的情况,如何做好版本隔离,Pyenv是个很好的选择,这里介绍下在Centos 7中Pyenv的安装和使用方法。

安装


开发Pyenv的大神在Github上写了安装脚本,使用安装脚本就能快速安全简单的完成,首先安装好脚本运行所需的环境。

  1. yum install -y @development zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel findutils git

  2. curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

注意:脚本运行结束会有个添加环境变量的“warning”,按照提示将变量添加到用户家目录的“.bashrc”文件

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

使用


运行“pyenv”命令出现帮助,"pyenv help command" 显示子命令的帮助

[python@localhost ~]$ pyenv
pyenv 1.2.13
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

install、uninstall、version及versions这种常用命令就不介绍了,敲命令试一下就知道怎么用了,local、global、shell这三个子命令的作用需要弄清楚以方便找到自己最合适的使用方式

  • global:全局之义,使用上面的“install”命令安装多个不同版本的python后,“versions”命令查询,会看到额外的不同版本的python,global可以设定谁作为系统维度下谁是默认唯一的python,一山不容二虎,当家只有一人,指定当家人的意思。
  • shell:顾名思义,即指shell环境,在此shell进程当中指定谁(哪个版本)是默认的python,国中之国,不管外面谁是老大,在这里我就是老大。但是我重新shell之后呢,老大又变成系统默认的了,每次登陆都要设定,似乎还是挺不实用的
  • local:“local”很容易让人想到shell脚本里的local变量,只在某个函数或进程有效,超出这个范围就失效了,这里的“local”指的是某一个固定的文件夹,进入这个文件夹,环境中的python自动变成指定的版本,跳出这个文件夹python就又变成了系统环境这个维度中默认的那个
[python@localhost web]$ python -V
Python 2.7.5
[python@localhost web]$ pyenv versions
* system (set by /home/python/project/web/.python-version)
  3.5.3
  3.5.3/envs/once353
  once353
[python@localhost web]$ pyenv local 3.5.3
[python@localhost web]$ python -V
Python 3.5.3
[python@localhost web]$ cd ..
[python@localhost project]$ python -V
Python 2.7.5
[python@localhost project]$ cd web/
[python@localhost web]$ python -V
Python 3.5.3

另外一个问题


local好像很能满足我们平时的需求,我们的开发项目都是以文件夹隔离区分的,python环境也能根据文件夹来自由切换了,但是有没有想到python本身呢,假如我们使用同一个版本的python,但是这个项目我们需要使用这个版的库文件,另外一个项目需要相同库的另一个版本,在这个项目里安装了符合条件的库,却污染了另一个项目。

从虚拟机到docker,虚拟化一直大行其道、深受好评,这里我们也可以使用虚拟化的方法来解决,安装完需要的python版本,将此版本的python虚拟出N多份,一个项目分配一份,不同项目都在各自的虚拟python中进行,所有改动不影响本源的python,似乎完美了。

virtaulenv
这个功能是以插件的形式存在,以脚本方式安装的pyenv会自动安装这个插件,如果提示没有“virtualenv”子命令,按照Github上作者的说明安装 virtualenv

[python@localhost project]$ pyenv help virtualenv
Usage: pyenv virtualenv [-f|--force] [VIRTUALENV_OPTIONS] [version] <virtualenv-name>
       pyenv virtualenv --version
       pyenv virtualenv --help

  -f/--force       Install even if the version appears to be installed already

[python@localhost project]$ pyenv virtualenv 3.5.3 helloworld353
Requirement already satisfied: setuptools in /home/python/.pyenv/versions/3.5.3/envs/helloworld353/lib/python3.5/site-packages
Requirement already satisfied: pip in /home/python/.pyenv/versions/3.5.3/envs/helloworld353/lib/python3.5/site-packages
[python@localhost project]$ pyenv versions
* system (set by /home/python/.pyenv/version)
  3.5.3
  3.5.3/envs/helloworld353
  3.5.3/envs/once353
  helloworld353
  once353

使用local命令,将虚拟出来的python分配给此文件夹使用

[python@localhost project]$ cd web/
[python@localhost web]$ python -V
Python 3.5.3
[python@localhost web]$ pyenv local helloworld353
(helloworld353) [python@localhost web]$ 

看,前面还有括号的内容提示我们所处的python环境

once

这个人太懒什么东西都没留下

文章评论(0)