7.python虚拟环境详解

1.为什么创建虚拟环境?

和其他大多数现代编程语言一样,Python对包和模块的下载、存储以及管理有其自己的一套方法,Python的包一般都存在几个特定的地方,大部分系统包会存在sys.prefix指定的路径下;大部分第三方包,比如easy_install或pip会将包存放在site-packages所指定的路径下。

Python应用程序通常会使用不在标准库内的软件包和模块,应用程序有时需要特定版本的库,由于Python导入模块不能区分模块版本,这意味着一个Python安装可能无法满足每个应用程序的要求。当我们同时开发多个工程时,不同的工程会将第三方的包存放在相同的路径下。如果有两个工程依赖同一个包,但是所需要的版本却不一样,例如应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,由于Python无法根据版本来区分包的安装路径,所以这里就会发生版本冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。

这个问题的解决方案是创建一个虚拟环境(virtual environment),一个目录树,其中安装有特定Python版本以及许多其他包,然后不同的应用将可以使用不同的虚拟环境,从而解决需求相冲突。应用程序 A 可以拥有自己的 安装了 1.0 版本的虚拟环境,而应用程序 B 则拥有安装了 2.0 版本的另一个虚拟环境。 如果应用程序 B 要求将某个库升级到 3.0 版本,也不会影响应用程序 A 的环境。使用虚拟环境的另一个好处是:保持开发环境的简洁、有序。

如果还没理解怎么办?结合具体场景再理解一遍

在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如Flask,Django,Scrapy,Beautiful Soup等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。这样的Python环境操作会给开发环境和项目造成很多不必要的麻烦,管理也相当混乱。 

具体场景1:假设两个Python项目A和B,这两个项目都需要使用同一个第三方模块tensorflow。如果这两个项目使用相同的tensorflow版本,也许不会有什么问题。但是,当A和B项目使用不同的tensorflow版本时即A使用tensorflow 0.70版本;B使用tensorflow 0.80版本。由于Python导入模块不能区分模块版本,导致项目A和项目B不能使用tensorflow的不同版本。

具体场景2:项目安装Flask框架flask-0.10.1版本,命令行输入sudo pip install flask==0.10.1,会将flask-0.10.1安装到/usr/local/lib/python3.5/dist-packages路径下;如果在一台电脑上,想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它之前的项目就无法运行了。

2.什么是虚拟环境?

虚拟环境是用于依赖项目管理和项目隔离的Python工具,允许Python站点包(第三方库)安装在本地特定项目的隔离目录中,而不是全局安装(即作为系统范围内的Python的一部分)。即Python虚拟环境的主要目的是为了给不同的工程创建互相独立的运行环境。虚拟环境可以搭建独立的Python运行环境,使得单个项目的运行环境与其他项目互不影响,每一个工程都有自己的依赖包。并且,虚拟环境的数量没有限制,我们可以轻松地用virtualenv或者pyenv等工具来创建多个虚拟环境。

白话python中通过虚拟化出来一个空间,从电脑独立开辟出来的环境,与主环境完全隔离。通俗的来讲,虚拟环境就是借助虚拟机docker来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互相隔离,互不影响。避免项目中对于环境要求,造成的插件版本混乱。

简单概括:

概念:一个独立的局部的 Python 环境;完全模拟系统全局 Python 环境的使用,如安装、卸载包到逻辑操作等 

作用:让项目运行在一个独立的局部的 Python 环境中,使采用不同环境的项目互不干扰。

3.搭建虚拟环境的过程和常见的使用方法

1).安装virtualenv软件包

前提必须安装好python环境,并检查电脑系统环境path是否有python路径,使用虚拟环境需要借助virtualenv或pyvenv,(其中pyvenv是较新的工具,和virtualenv的使用方法类似),它们的使用非常简单。这里主要讲解virtualenv,virtualenv 是一个创建隔绝的Python环境的工具,首先安装virtualenv(如果使用Python 3,它自动默认安装了pyvenv)。

1 pip install virtualenv

它会默认安装到你的python库文件lib中,可以看安装完成的地址,里面给出了安装之后的库地址

2).创建虚拟环境(virtualenv基本使用)

  (1). 通过上面的步骤安装成功之后,首先确定好要放置虚拟环境的目录(我一般习惯在项目当中建立一个目录用来存放给这个项目使用的虚拟环境),然后进入你想要创建python虚拟环境的目录下,没有合适的就创建一个空文件夹即可:

1 mkdir filename      # 可以新建一个名为filename的空文件夹,用来存放即将创建的虚拟环境
2 cd filename         # 进入到这个空文件夹下

  (2). cd 到存放虚拟环境的的地址,就可以创建虚拟环境了,执行下面的命令会在当前所在目录进行创建(若省略名字将会把文件均放在当前目录):

1 virtualenv envname       # venvname为虚拟环境目录名,目录名自定义

  (3). 创建虚拟环境时可以加上版本号指定 Python 版本,不然默认系统全局下的 Python 环境:(Linux系统下是Python2的虚拟环境,Windows系统下是自己安装好的系统全局python版本,如果系统上有多个版本的 Python,您以通过运行 <span>python3</span> 或您想要的任何版本来选择特定的Python版本)

1 virtualenv -p python3 test_env1       # -p参数 指定Python解释器程序
2 
3 virtualenv -p /usr/local/bin/python3.5 test_env2   # -p参数 指定Python解释器程序(路径)

  (4). 创建虚拟环境时可以继承系统三方库 ,添加参数--system-site-packages,即项目检索库的时候,也会到系统的三方库中找,不添加时,默认只到虚拟环境中查找库:

1 virtualenv --system-site-packages envmane

【补充】:虚拟环境到底长啥样?执行virtualenv envname命令之后,就会在当前的目录中创建一个文件夹,并在其中创建包含Python解释器,标准库和各种支持文件的副本的目录,生成如下的目录结构:(Linux或Mac系统下)

├──bin
│  ├──activate
│  ├──activate.csh
│  ├──activate.fish
│  ├──easy_install
│  ├──easy_install-3.5
│  ├──pip
│  ├──pip3
│  ├──pip3.5
│  ├──python->python3.5
│  ├──python3->python3.5
│  └──python3.5->/opt/local/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
├──include
├──lib
│  └──python3.5
│      └──site-packages
└──pyvenv.cfg

bin: 用于管理虚拟环境的文件,bin目录下有一个重要的脚本文件activate,这个脚本就是用来将其所在的虚拟环境设置为当前Python的运行环境

include: 编译Python包时所需要的C头文件

lib: Python自带及第三方的库这其中还包含有一些Python的工具和可执行文件等副本。这些文件用来保证Python代码可以独立于系统环境而运行。

【注意】:1.上面的结构是在Linux或Mac系统下,这里的bin目录在Windows系统下叫Scripts目录;

   2.Windows与 Mac 不同的是,虚拟环境的 bin 目录下只有 activate 脚本,没有 deactivate 脚本。

3). 激活虚拟环境

首先确保cd到存放虚拟环境文件夹目录下,选择要激活的虚拟环境(例如选择envname):

1 envname\Scripts\activate        # 在Windows上
2 
3 source envname/bin/activate     # 在Unix或MacOS上

(这个脚本是为bash shell编写的,如果使用 csh 或 fish shell,则应该改用 activate.csh 或 activate.fish 脚本)。进入之后就可以通过pip 命令安装、升级和移除各种需要的框架依赖包和软件包了,此时使用pip安装的包都将会放在 已激活的这个虚拟环境文件夹中,与全局安装的Python隔离开。

4). 退出虚拟环境

在激活的虚拟环境中,执行命令 deactivate:

1 deactivate

执行完上面的代码,将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。即我们的shell提示符回归到了正常状态,同时Python的环境也切换到了全局的系统环境。

5). 删除虚拟环境

直接删除虚拟环境所在目录即可:

1  rm -rf venvname

4.虚拟环境的配置(统一管理虚拟环境)

通过上面的步骤其实已经完成虚拟环境virtualenv的安装和使用了,虚拟环境的引入解决了我们关于环境冲突的问题,但是它同时也带来了一个问题,就是虚拟环境过多所带来的管理问题,它需要我们记住每一个虚拟环境的目录,才能进入虚拟环境并操作,因此这里的virtualenv不是最完美的,因为virtual的启动、停止脚本都在特定文件夹,可能一段时间后,就会有很多个虚拟环境散落在系统各处,很难再记住它们的名字或者位置。

鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper,virtualenvwrapper就是专门用来解决虚拟环境管理问题的一个工具,它提供了一系列命令使得虚拟环境工作变得便利,它把你所有的虚拟环境都放在一个地方,我们可以很方便地用它来实现对虚拟环境的创建,删除,拷贝,并且可以轻松地在不同环境间进行切换。

1). 安装virtualenvwrapper(确保virtualenv已安装)

1 pip install virtualenvwrapper       # Linux和Mac系统
2 pip install virtualenvwrapper-win   # Windows使用该命令

2). 配置环境变量

  (1). 为什么配置虚拟环境?安装完virtualenvwrapper之后,此时mkvirtualenv这个命令还不可以直接使用原因是我们还没有配置虚拟环境的环境变量,包括workon我们也无法使用。拿Linux系统举例,当安装第三方包的时候,会先source一下virtualenvwrapper.sh这个文件(执行脚本文件的意思),因为mkvirtualenv指令是在virtualenvwrapper.sh这个文件里面,也就是执行virtualenvwrapper.sh这个文件的时候,才可以运行像mkvirtualenv这样的指令;所以把source /usr/local/bin/virtualenvwrapper.sh 这段代码添加到一个文件里面,每次只要打开这个文件,就会执行。 

  (2). 查看一下virtualenvwrapper.sh的路径:

1 which virtualenvwrapper.sh    # 假设路径为/usr/local/bin/virtualenvwrapper.sh

  (3). Linux或Mac系统下配置:

# 1、在~(家目录)下创建目录用来存放虚拟环境(有就不用)
mkdir .virtualenvs

vim ~/.bashrc         # 打开.bashrc配置文件

# 添加如下内容:
export WORKON_HOME=$HOME/.virtualenvs          # virtualenvwrapper存放虚拟环境目录
source /usr/local/bin/virtualenvwrapper.sh     # virtrualenvwrapper会安装到python的bin目录下,该路径是python安装目录下bin/virtualenvwrapper.sh

source ~/.bashrc     # 读入配置文件,立即生效

此时创建虚拟环境时所有的虚拟环境都位于/home/下的隐藏目录.virtualenvs下;创建虚拟环境需要联网;创建成功后, 会自动工作在这个虚拟环境上;工作在虚拟环境上, 提示符最前面会出现 “虚拟环境名称”。

如果~/.bashrc里面的内容改为export WORKON_HOME=~/Envsname,这样会在WORKON_HOME变量指定的目录下新建名为Eenvsname的虚拟环境。

  (4). Windows系统下配置:

给虚拟环境安装目录设置一个专门的目录,Windows系统下安装完virtualenvwrapper-win,再创建虚拟环境时,会默认放在C:\Users\电脑用户名\Envs目录中。

如果这样满足不了我们的需求,我们想把项目放在其他盘(或其他位置),就需要我们自己配置一下环境路径,通过设置WORKON_HOME路径,给我们的python虚拟环境指定一个存放位置:

   > 新建要存一个自己想要放虚拟环境的文件夹:例如 D:\codeworkpace\python\envs

   > 配置电脑系统环境变量,->新建系统变量 -> 变量名:WORKON_HOME ->指定路径:D:\codeworkpace\python\envs

配置完环境变量就会在WORKON_HOME所在的路径下创建集中存放虚拟环境的目录了。

3). virtualenvwrapper基本使用指令

mkcirtualenv 虚拟环境名称    # 创建虚拟环境

workon                     # 查看当前的虚拟环境目录(列出所有虚拟环境列表)

workon 虚拟环境名称          # 切换到指定虚拟环境(进入虚拟环境)

deactivate                 # 退出虚拟环境

rmvirtualenv 虚拟环境名      # 删除虚拟环境(先退出再删除)

which python               # 查看虚拟环境的python的路径

5.conda虚拟环境操作

conda create -n xxxx python=3.5    # 创建指定python版本的xxxx虚拟环境:
 
conda activate xxxx    # 进入xxxx环境
 
conda deactivate      # 退出(关闭环境)

conda remove -n your_env_name(虚拟环境名称) --all    # 删除虚拟环境

conda remove --name your_env_name  package_name     # 删除虚拟环境中的某个包

# 查看已安装环境(显示所有的虚拟环境,conda默认(自带)有一个base环境)
conda info –e   
conda info –envs   
conda env list

【注意】:conda离线创建环境时:需要将错误信息里有一项是offline mode:false 改为 offline mode:true ,不然创建不成功

1 conda config --set offline true

【补充】:安装时可能出现的bug

   1).  anaconda装环境遇到无法定位程序输入点OPENSSL_sk_new_reserve……问题:首先进入Anaconda\DLLS目录,查看libssl-1_1-x64.dll的日期;然后进入Anaconda\Library\bin目录,比较两者日期;如果不一致,将DLLS中的替换到bin中的;最后再执行conda create -n xxxx python=3.5

即可。

   2). anaconda出现CondaHTTPError问题:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.continuum.io/pkgs/free/noarch/repodata.json.bz2>  (一般是设置代理的问题)

最后补充俩指令:

   查看虚拟环境中安装的包:pip freeze 或 pip list

   查看文件里面的内容,例如requirements.txt文件:cat requirements.txt

相关推荐