Python虚拟环境工具-Virtualenv 介绍及部署记录

 

在开发Python应用程序时,系统默认的Python版本可能会不兼容这个应用程序, 若是同时开发多个应用程序, 可能会用到好几个版本的python环境, 这种状况下,每一个应用可能须要各自拥有一套"独立"的Python运行环境。virtualenv就是用来为一个应用建立一套"隔离"的Python运行环境的工具。virtualenv是python的一个虚拟化环境工具,用来创建一个虚拟的python环境,一个专属于项目的python环境, 用virtualenv 来保持一个干净的环境很是有用, 能够帮助咱们在同一台host上建立多套纯净的python解释器环境并实现相互隔离,各个环境下安装的库仅限于本身的环境,不会影响到别人。python

动态语言Ruby、Python都有本身的虚拟环境,虚拟环境是程序执行时的独立执行环境,在同一台服务器中能够建立不一样的虚拟环境供不一样的系统使用,项目之间的运行环境保持独立性而相互不受影响。例如项目A在基于Python2的环境中运行,而项目B能够在基于Python3的环境中运行。Python通virtualenv工具管理虚拟环境。react

简而言之, Virtualenv是一个建立隔绝的Python环境的工具。virtualenv建立一个包含全部必要的可执行文件的文件夹,用来使用Python工程所需的包。Virtualenv用于建立独立的Python环境,多个Python相互独立,互不影响,它可以帮助
-  在没有权限的状况下安装新套件;
-  不一样应用可使用不一样的套件版本;
-  套件升级不影响其余应用。
-  隔离项目之间的第三方包依赖
-  在没有权限的状况下安装新的Python软件包
-  还有一个额外的好处:部署应用时,把开发环境的虚拟环境打包到生产环境便可。vim

virtualenv 安装centos

[root@kevin-test ~]# cat /etc/redhat-release     (本文是在centos7下操做并验证无误)
CentOS Linux release 7.5.1804 (Core)
 
[root@kevin-test ~]# python -V
Python 2.7.5
 
[root@kevin-test ~]# pip -V
-bash: pip: command not found
 
先来安装pip
[root@kevin-test ~]# yum -y install epel-release
[root@kevin-test ~]# yum install python-pip
[root@kevin-test ~]# pip install --upgrade pip
[root@kevin-test ~]# pip -V
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
 
经过pip安装virtualenv
[root@kevin-test ~]# pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/7c/17/9b7b6cddfd255388b58c61e25b091047f6814183e1d63741c8df8dcd65a2/virtualenv-16.1.0-py2.py3-none-any.whl (1.9MB)
    100% |████████████████████████████████| 1.9MB 1.3MB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-16.1.0
 
测试安装后virtualenv的版本
[root@kevin-test ~]# virtualenv  --version
16.1.0

查看帮助
[root@kevin-test ~]# virtualenv --help
Usage: virtualenv [OPTIONS] DEST_DIR

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -v, --verbose         Increase verbosity.
  -q, --quiet           Decrease verbosity.
  -p PYTHON_EXE, --python=PYTHON_EXE
                        The Python interpreter to use, e.g.,
                        --python=python3.5 will use the python3.5 interpreter
                        to create the new environment.  The default is the
                        interpreter that virtualenv was installed with
                        (/usr/bin/python2)
  --clear               Clear out the non-root install and start from scratch.
  --no-site-packages    DEPRECATED. Retained only for backward compatibility.
                        Not having access to global site-packages is now the
                        default behavior.
  --system-site-packages
                        Give the virtual environment access to the global
                        site-packages.
  --always-copy         Always copy files rather than symlinking.
  --relocatable         Make an EXISTING virtualenv environment relocatable.
                        This fixes up scripts and makes all .pth files
                        relative.
  --no-setuptools       Do not install setuptools in the new virtualenv.
  --no-pip              Do not install pip in the new virtualenv.
  --no-wheel            Do not install wheel in the new virtualenv.
  --extra-search-dir=DIR
                        Directory to look for setuptools/pip distributions in.
                        This option can be used multiple times.
  --download            Download preinstalled packages from PyPI.
  --no-download, --never-download
                        Do not download preinstalled packages from PyPI.
  --prompt=PROMPT       Provides an alternative prompt prefix for this
                        environment.
  --setuptools          DEPRECATED. Retained only for backward compatibility.
                        This option has no effect.
  --distribute          DEPRECATED. Retained only for backward compatibility.
                        This option has no effect.
  --unzip-setuptools    DEPRECATED.  Retained only for backward compatibility.
                        This option has no effect.

virtualenv 使用bash

如今为某一个工程建立一个虚拟环境, 建立一个独立的Python运行环境,命名为pj_test (这是虚拟环境目录名,目录名可自行自定义)
[root@kevin-test ~]# cd /opt/
[root@kevin-test opt]# mkdir project_test
[root@kevin-test opt]# cd project_test
[root@kevin-test project_test]# virtualenv --no-site-packages pj_test
New python executable in /opt/project_test/pj_test/bin/python2
Also creating executable in /opt/project_test/pj_test/bin/python
Installing setuptools, pip, wheel...
done.

如上命令virtualenv就能够建立一个独立的Python运行环境,这里还加上了参数--no-site-packages (也能够不跟这个参数),这样已经安装到系统Python环境
中的全部第三方包都不会复制过来,因而就获得了一个不带任何第三方包的"干净"的Python运行环境。

上面命令将会在当前的目录中建立一个文件夹pj_test,这个文件夹包含一些Python执行文件,以及pip副本,用于安装其余的packges。
虚拟环境的名字(此例中是pj_test )能够是任意的;若省略名字将会把文件均放在当前目录。

[root@kevin-test project_test]# ls
pj_test
[root@kevin-test project_test]# ls pj_test/
bin  include  lib  lib64

[root@kevin-test project_test]# yum install -y tree
[root@kevin-test project_test]# tree pj_test/bin     
pj_test/bin
├── activate
├── activate.csh
├── activate.fish
├── activate.ps1
├── activate_this.py
├── easy_install
├── easy_install-2.7
├── pip
├── pip2
├── pip2.7
├── python -> python2
├── python2
├── python2.7 -> python2
├── python-config
└── wheel

[root@kevin-test project_test]# tree pj_test/include/
pj_test/include/
└── python2.7 -> /usr/include/python2.7

[root@kevin-test project_test]# tree pj_test/lib| head -3
pj_test/lib
└── python2.7
    ├── _abcoll.py -> /usr/lib64/python2.7/_abcoll.py

新建的Python环境被放到当前目录下的pj_test目录。有了pj_test这个Python环境,能够用source激活虚拟环境:
[root@kevin-test project_test]# pwd
/opt/project_test
[root@kevin-test project_test]# ls
pj_test
[root@kevin-test project_test]# cd pj_test/
[root@kevin-test pj_test]# source ./bin/activate
(pj_test) [root@kevin-test pj_test]# python -V
Python 2.7.5

激活虚拟环境, 在虚拟环境里, 任何使用pip安装的包将会放在 venv 文件夹中,与全局安装或其余应用的Python环境彻底隔绝开。

若是建立虚拟环境时不选择指定的python版本, 那么虚拟环境建立后默认就是系统默认的python版本.
好比若是系统还有一个python3.6.1, 路径为: /usr/local/python3/bin/python3
[root@kevin-test pj_test]# /usr/local/python3/bin/python3 -V   
Python 3.6.1

则建立虚拟机时选择指定的python版本
[root@kevin-test project_test]# virtualenv --no-site-packages -p /usr/local/python3/bin/python3.6.1 pj_test
[root@kevin-test project_test]# cd pj_test/
[root@kevin-test pj_test]# source ./bin/activate
(pj_test) [root@kevin-test pj_test]# python -V
Python 3.6.1

能够在服务器上提早安装多个版本的python环境, 不一样版本的python的二进制路径不同
而后在使用virtualenv建立各个项目的虚拟环境时指定不一样的python版本, 这样各个项目python解释器环境就实现了相互隔离, 很是纯净!

使用"deactivate" 命令退出或停用虚拟环境:
[root@kevin-test project_test]# cd pj_test/
[root@kevin-test pj_test]# source ./bin/activate
(pj_test) [root@kevin-test pj_test]# python -V
Python 2.7.5
(pj_test) [root@kevin-test pj_test]# deactivate
[root@kevin-test pj_test]#

退出虚拟环境后, 此时就回到了正常的环境,如今pip或python均是在系统Python环境下执行。
退出虚拟环境后, 以前在虚拟环境里的部署的应用程序的使用都不会受到影响!
彻底能够针对每一个应用建立独立的Python运行环境,这样就能够对每一个应用的Python环境进行隔离。

若是要删除一个虚拟环境, 只需删除它的虚拟目录便可, 好比要删除虚拟环境pj_test, 则:
[root@kevin-test pj_test]#  rm -rf /opt/project_test/pj_test/

在虚拟环境安装 Python packages服务器

Virtualenv 附带有pip安装工具,所以须要安装的packages能够直接运行:
(pj_test) [root@kevin-test pj_test]# pip install [套件名称]
(pj_test) [root@kevin-test pj_test]# pip -V
pip 18.1 from /opt/project_test/pj_test/lib/python2.7/site-packages/pip (python 2.7)

(pj_test) [root@kevin-test pj_test]# pip install jinja2

安装后, 能够在虚拟环境里找到这个套件
(pj_test) [root@kevin-test pj_test]# ll -d /opt/project_test/pj_test/lib/python2.7/site-packages/jinja2/
drwxr-xr-x 2 root root 4096 Dec 17 18:26 /opt/project_test/pj_test/lib/python2.7/site-packages/jinja2/

在虚拟环境下,用pip安装的包都被安装到对应虚拟的这个环境下,系统Python环境不受任何影响。
也就是说,虚拟环境是专门针对具体的某个应用建立的。

[root@kevin-test ~]# pip -V
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)

若是没有启动虚拟环境,系统环境也安装了pip工具,那么packages将被安装在系统环境中.
为了不发生此事,能够在~/.bashrc文件中加上 (最好添加下面的内容):
[root@kevin-test ~]# vim ~/.bashrc
export PIP_REQUIRE_VIRTUALENV=true

使配置生效
[root@kevin-test ~]# source ~/.bashrc

若是在没开启虚拟环境时, 在虚拟环境以外的系统上运行pip,就会提示错误:"Could not find an activated virtualenv (required)".

如上安装好virtualenv以后, 就能够解决python版本冲突问题和python库不一样版本的问题了!!app

virtualenv 用法小总结运维

1) 建立环境
virtualenv [新环境名] :这会再当前目录下建立一个新环境目录
可以使用 virtualenv --help 来查看如何使用。可使用参数 --python=/usr/bin/python3 来建立一个已经安装的的Python环境。

2) 使用环境
切换到项目的新环境目录
执行:source ./bin/activate 来激活环境,激活后在命令行的前面会出现新环境名称
接下来可以使用pip命令安装新环境须要的各类包。(pip命令在建立新环境时自带)

3) 退出虚拟环境
deactivate
若是要删除虚拟环境,只需退出虚拟环境后,删除对应的虚拟环境目录便可。不影响其余环境。

4) 注意事项
若是没有启动虚拟环境,系统也安装了pip工具,那么套件将被安装在系统环境中,为了不发生此事,能够在~/.bashrc文件中加上:export PIP_REQUIRE_VIRTUALENV=true
或者让在执行pip的时候让系统自动开启虚拟环境:export PIP_REQUIRE_VIRTUALENV=true

5) 保证环境一致性
用pip freeze查看当前安装版本
[root@kevin-test ~]# pip freeze

另外:
[root@kevin-test ~]# pip freeze > requirements.txt
这将会建立一个 requirements.txt 文件,其中包含了当前环境中全部包及 各自的版本的简单列表。
可使用 "pip list"在不产生requirements文件的状况下, 查看已安装包的列表。

这将会使另外一个不一样的开发者(或者是你本人,若是你本人须要从新建立这样的环境) 在之后安装相同版本的相同包变得容易。
将这个requirements.txt拷贝到新的机器环境下执行:
# pip install -r requirements.txt

这能帮助确保安装、部署和开发者之间的一致性。

虚拟环境管理工具 - Virtualenvwrapper 
virtualenv使用起来不是很方便,由于virtual的启动、中止脚本都在特定目录,可能一段时间后,你可能会有不少个虚拟环境散落在系统各处,你可能忘记它们的名字或者位置。鉴于virtualenv不便于对虚拟环境集中管理,因此推荐直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虚拟环境工做变得便利。它把你全部的虚拟环境都放在一个地方。python2.7

Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境,它能够作:
-  将全部虚拟环境整合在一个目录下;
-  管理(新增,删除,复制)虚拟环境;
-  切换虚拟环境等等.

安装virtualenvwrapper (确保virtualenv已提早安装)
[root@kevin-test ~]# pip install virtualenvwrapper
Could not find an activated virtualenv (required).

若是出现上面的报错:"Could not find an activated virtualenv (required)."

解决办法:
打开~/.bashrc文件, 添加下面的内容
[root@kevin-test ~]# vim ~/.bashrc 
export PIP_REQUIRE_VIRTUALENV=true
[root@kevin-test ~]# source ~/.bashrc

而后接着安装virtualenvwrapper
[root@kevin-test ~]# pip install virtualenvwrapper

若是仍是出现上面的那个报错:"Could not find an activated virtualenv (required)."

接着执行下面命令(~/.bashrc文件里设置该参数为true, 确保pip安装的包在虚拟环境下; 虚拟环境以外的系统里执行pip时, 每次须要手动source 这个参数的false值)
[root@kevin-test ~]# export PIP_REQUIRE_VIRTUALENV=false

最后再次安装virtualenvwrapper便可
[root@kevin-test ~]# pip install virtualenvwrapper      
Collecting virtualenvwrapper
  Using cached https://files.pythonhosted.org/packages/2b/8c/3192e10913ad945c0f0fcb17e9b2679434a28ad58ee31ce0104cba3b1154/virtualenvwrapper-4.8.2-py2.py3-none-any.whl
Requirement already satisfied: virtualenv-clone in /usr/lib/python2.7/site-packages/virtualenv_clone-0.4.0-py2.7.egg (from virtualenvwrapper) (0.4.0)
Requirement already satisfied: stevedore in /usr/lib/python2.7/site-packages/stevedore-1.30.0-py2.7.egg (from virtualenvwrapper) (1.30.0)
Requirement already satisfied: virtualenv in /usr/lib/python2.7/site-packages (from virtualenvwrapper) (16.1.0)
Requirement already satisfied: pbr!=2.1.0,>=2.0.0 in /usr/lib/python2.7/site-packages/pbr-5.1.1-py2.7.egg (from stevedore->virtualenvwrapper) (5.1.1)
Requirement already satisfied: six>=1.10.0 in /usr/lib/python2.7/site-packages/six-1.12.0-py2.7.egg (from stevedore->virtualenvwrapper) (1.12.0)
Installing collected packages: virtualenvwrapper
Successfully installed virtualenvwrapper-4.8.2

默认virtualenvwrapper安装在下面python解释器中的site-packages,实际上须要运行virtualenvwrapper.sh文件才行;
因此要查找出安装的virtualenvwrapper.sh执行文件
[root@kevin-test ~]# find / -name virtualenvwrapper*
/usr/bin/virtualenvwrapper.sh
/usr/bin/virtualenvwrapper_lazy.sh
/usr/lib/python2.7/site-packages/virtualenvwrapper-4.8.2-py2.7-nspkg.pth
/usr/lib/python2.7/site-packages/virtualenvwrapper
/usr/lib/python2.7/site-packages/virtualenvwrapper-4.8.2.dist-info

此时还不能使用virtualenvwrapper,每次要想使用virtualenvwrapper 工具时,都必须先激活virtualenvwrapper.sh文件才行,
另外,若是建立前要将即将的环境保存到虚拟环境中,就要先设置一下环境变量

设置环境变量
[root@kevin-test ~]# export WORKON_HOME=~/Envs

建立虚拟环境管理目录. 即建立的虚拟环境都会放到上面设置的~/Envs目录下面
[root@kevin-test ~]# mkdir -p $WORKON_HOME

在~/.bashrc文件里配置环境变量, 添加下面两行
第一行表示: 存放虚拟环境目录
第二行表示: virtrualenvwrapper.sh执行文件的路径
[root@kevin-test ~]# vim ~/.bashrc
export WORKON_HOME=~/Envs
source /usr/bin/virtualenvwrapper.sh

使得以上环境变量的配置生效
[root@kevin-test ~]# source ~/.bashrc

如今开始使用Virtualenvwrapper 管理虚拟机 (能够删除上面以前建立的虚拟环境/opt/project_test/pj_test 了, 后续都将使用Virtualenvwrapper建立和管理虚拟环境)

a) 使用mkvirtualenv 命令建立虚拟环境
建立一个虚拟环境, 虚拟机名称为project_kevin:
[root@kevin-test ~]# mkvirtualenv project_kevin
New python executable in /root/Envs/project_kevin/bin/python2
Also creating executable in /root/Envs/project_kevin/bin/python
Installing setuptools, pip, wheel...
done.
virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/preactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/postactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_kevin/bin/get_env_details
(project_kevin) [root@kevin-test ~]# 

再建立另外一个虚拟机, 虚拟机名称为project_bobo
(project_kevin) [root@kevin-test ~]# deactivate                                //先退出上面的那个虚拟环境
[root@kevin-test ~]# mkvirtualenv --no-site-packages project_bo      //这里加上了参数--no-site-packages
New python executable in /root/Envs/project_bo/bin/python2
Also creating executable in /root/Envs/project_bo/bin/python
Installing setuptools, pip, wheel...
done.
virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/preactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/postactivate
virtualenvwrapper.user_scripts creating /root/Envs/project_bo/bin/get_env_details
(project_bo) [root@kevin-test ~]# 

====================================================
还能够选择指定的python版本进行虚拟环境的建立, 不过指定的python版本必需要提早安装好, 好比
# mkvirtualenv project_hui --python=python3.6.1
# mkvirtualenv project_hui --python=/usr/local/python3/bin/python3.6.1
====================================================

建立的虚拟环境的项目目录都放在了上面设置的环境变量目录~/Envs下面
[root@kevin-test ~]# ll -d ~/Envs/project_kevin/
drwxr-xr-x 5 root root 56 Dec 17 22:27 /root/Envs/project_kevin/
[root@kevin-test ~]# ll -d ~/Envs/project_bo/
drwxr-xr-x 5 root root 56 Dec 17 22:28 /root/Envs/project_bo/

b) 使用workon 或者 lsvirtualenv 命令列出虚拟环境列表
[root@kevin-test ~]# workon 
project_bo
project_kevin

或者
[root@kevin-test ~]# lsvirtualenv
project_bo
==========


project_kevin
=============

c) 使用workon 启动/切换虚拟环境
[root@kevin-test ~]# workon project_bo
(project_bo) [root@kevin-test ~]# python -V
Python 2.7.5
(project_bo) [root@kevin-test ~]# 

建立一个项目,它会建立虚拟环境,并在 $WORKON_HOME 中建立一个项目目录。 
当您使用 "workon 项目的虚拟环境名称" 时,它会自动cd -ed 到项目目录中。

d) 使用deactivate命令退出/离开虚拟环境,和virutalenv同样的命令
[root@kevin-test ~]# workon project_bo
(project_bo) [root@kevin-test ~]# python -V
Python 2.7.5
(project_bo) [root@kevin-test ~]# deactivate
[root@kevin-test ~]# 

e) 使用rmvirtualenv 命令 删除虚拟环境
[root@kevin-test ~]# lsvirtualenv     
project_bo
==========


project_kevin
=============


[root@kevin-test ~]# rmvirtualenv project_bo
Removing project_bo...
[root@kevin-test ~]# lsvirtualenv           
project_kevin
=============

f) 使用lssitepackages命令显示 site-packages 目录中的内容。
[root@kevin-test ~]# workon project_kevin        
(project_kevin) [root@kevin-test ~]# lssitepackages 
easy_install.py   pip                 pkg_resources  setuptools-40.6.3.dist-info  wheel-0.32.3.dist-info
easy_install.pyc  pip-18.1.dist-info  setuptools     wheel

g) 使用cdvirtualenv命令导航到当前激活的虚拟环境的目录中,好比说这样就可以浏览它的site-packages。
[root@kevin-test ~]# workon project_kevin                
(project_kevin) [root@kevin-test site-packages]# cdvirtualenv 
(project_kevin) [root@kevin-test project_kevin]# ls
bin  include  lib  lib64

h) 使用cdsitepackages命令直接进入到 site-packages 目录中, 和上面的cdvirtualenv 相似
[root@kevin-test ~]# workon project_kevin
(project_kevin) [root@kevin-test ~]# cdsitepackages 
(project_kevin) [root@kevin-test site-packages]# ls
easy_install.py   pip                 pkg_resources  setuptools-40.6.3.dist-info  wheel-0.32.3.dist-info
easy_install.pyc  pip-18.1.dist-info  setuptools     wheel

=============================================
为了方便运维管理, 能够进行一些别名设置, 以下:
[root@kevin-test ~]# vim ~/.bashrc 
#virtualenv
alias vte='virtualenv'
alias mkvte='mkvirtualenv'
alias deact='deactivate' 
alias rmvte='rmvirtualenv'
alias lsvte='lsvirtualenv'
alias won='workon'

使得上面配置生效
[root@kevin-test ~]# source ~/.bashrc

使用别名进行操做
[root@kevin-test ~]# lsvte
project_kevin
=============

[root@kevin-test ~]# won project_kevin
(project_kevin) [root@kevin-test ~]# deact

[root@kevin-test ~]# rmvte project_kevin
Removing project_kevin...

[root@kevin-test ~]# lsvte
[root@kevin-test ~]#

virtualenv使用时遇到的一个坑点, 常常排查验证, 得出结论以下:ide

1) root用户和普通用户均可以建立虚拟环境(好比虚拟环境名称为venv),venv虚拟环境的相关文件和文件夹的owner都是该用户,
    若是是非root的其余用户激活该venv虚拟环境的话,会由于文件权限的问题致使python库安装失败!!
    因此说: 非root用户不要去激活使用其余用户建立的venv虚拟环境!

2) 一旦以用户A的身份激活venv虚拟环境后,在虚拟环境中就不能再经过su命令切换其余用户,不然会自动退出虚拟环境!
    因此说: 在虚拟环境中不要经过su切换用户!

3) 以用户A的身份激活某venv虚拟环境后,在虚拟环境中全部经过"sudo + cmd"执行的命令,都等同于在虚拟环境外执行。
    因此说: 在虚拟环境中不要经过sudo执行命令

以上提到的3个小问题,在使用virtualenv的时候必定要注意。
相关文章
相关标签/搜索