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,您以通过运行 python3 或您想要的任何版本来选择特定的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系统下)

 1 ├──bin
 2 │  ├──activate
 3 │  ├──activate.csh
 4 │  ├──activate.fish
 5 │  ├──easy_install
 6 │  ├──easy_install-3.5
 7 │  ├──pip
 8 │  ├──pip3
 9 │  ├──pip3.5
10 │  ├──python->python3.5
11 │  ├──python3->python3.5
12 │  └──python3.5->/opt/local/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
13 ├──include
14 ├──lib
15 │  └──python3.5
16 │      └──site-packages
17 └──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 # 1、在~(家目录)下创建目录用来存放虚拟环境(有就不用)
 2 mkdir .virtualenvs
 3
 4 vim ~/.bashrc         # 打开.bashrc配置文件
 5
 6 # 添加如下内容:
 7 export WORKON_HOME=$HOME/.virtualenvs          # virtualenvwrapper存放虚拟环境目录
 8 source /usr/local/bin/virtualenvwrapper.sh     # virtrualenvwrapper会安装到python的bin目录下,该路径是python安装目录下bin/virtualenvwrapper.sh
 9
10 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基本使用指令

 1 mkcirtualenv 虚拟环境名称    # 创建虚拟环境
 2
 3 workon                     # 查看当前的虚拟环境目录(列出所有虚拟环境列表)
 4
 5 workon 虚拟环境名称          # 切换到指定虚拟环境(进入虚拟环境)
 6
 7 deactivate                 # 退出虚拟环境
 8
 9 rmvirtualenv 虚拟环境名      # 删除虚拟环境(先退出再删除)
10
11 which python               # 查看虚拟环境的python的路径

5.conda虚拟环境操作

 1 conda create -n xxxx python=3.5    # 创建指定python版本的xxxx虚拟环境:
 2
 3 conda activate xxxx    # 进入xxxx环境
 4
 5 conda deactivate      # 退出(关闭环境)
 6
 7 conda remove -n your_env_name(虚拟环境名称) --all    # 删除虚拟环境
 8
 9 conda remove --name your_env_name  package_name     # 删除虚拟环境中的某个包
10
11 # 查看已安装环境(显示所有的虚拟环境,conda默认(自带)有一个base环境)
12 conda info –e
13 conda info –envs
14 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

原文地址:https://www.cnblogs.com/bonheur/p/12315575.html

时间: 2024-08-30 06:17:25

7.python虚拟环境详解的相关文章

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

python线程详解

#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threading.currentThread():返回当前的线程变量threading.enumerate():返回一个包含正在运行的线程的list,正在运行指:线程启动后,结束前,不包含启动前和终止后的线程threading.activeCount():返回正在运行的线程数量,与len(threading.en

python difflib详解

difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. class difflib.SequenceMatcher 这是可以用来比较任何类型片段的类,只要比较的片段是可hash的,都可以用来比较,使用非常灵活.他源于1980,s的“完形匹配算法”,并且进行了一系列的优化和改进. 通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,

转 python数据类型详解

python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(') 用单引号括起来表示字符串,例如: str='this is string'; print str; b.使用双引号(") 双引号中的字符串与单引号中的字符串用法完全相同,例如: str="this is string"; print str; c.使用三引号(''') 利用三

Python列表详解

Python列表详解: 创建一个列表,只要把逗号分隔的不同数据项使用方括号括起来即可. 比如:    list = [1, 2, 3, 4, 5 ]; 与字符串的索引一样,列表索引从0开始. Python列表函数即方法: Python所包含的函数: 1.cmp() 描述: cmp()用于比较两个列表的元素. 语法: cmp (list1,list2) 返回值: 如果比较的元素是同类型的,则比较其值,返回结果. 如果两个元素不是同一种类型,则检查它们是否是数字. 如果是数字,执行必要的数字强制类型

Python 递归函数 详解

Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会是: 为什么会得出上面的结果呢?因为都把调用函数本身之后的代码给忘记了,就是else之后的python 代码. 实际此递归函数输出的是以下结果: 相信大家看到这里都有点蒙,小编也一样,我第一次看到这个递归函数时,只能理解到第一个结果.那是因为,大部分人在做事情的时候,中断第一件事,被安排去做第二件事

Python数据类型详解——列表

Python数据类型详解--列表 在"Python之基本数据类型概览"一节中,大概介绍了列表的基本用法,本节我们详细学一下列表. 如何定义列表:在[]内以英文里输入法的逗号,,按照索引,存放各种数据类型,每个位置代表一个元素. 回顾一下列表的特点: 1.可存放多个值. 2.按照从左到右的顺序定义列表元素,下标从0开始顺序访问,是有序的. 3.可修改指定索引位置对应的值,可变. 一.列表元素的增加操作 1.追加 用append方法将数据追加到列表的尾部 names = ['Kwan',

python面向对象详解(上)

创建类 Python 类使用 class 关键字来创建.简单的类的声明可以是关键字后紧跟类名: class ClassName(bases): 'class documentation string' #'类文档字符串' class_suite #类体 实例化 通过类名后跟一对圆括号实例化一个类 mc = MyClass() # instantiate class 初始化类 'int()'构造器 def __int__(self): pass 注意:self类似Java的this关键字作用,它代

python字典详解

字典是Python中唯一的內建的映射类型,可以存储任意对象的容器,比如:字符串,列表,元组,自定义对象等:字典由键(key)与值(value)组成,基本语法如下: {key:value, ... ...}字典中每个Key是唯一的,key必须是可哈希(后面我们介绍): 这节我们来看下字典基本知识点: 1>字典定义.遍历.修改:2>理解字典key:4>字典相关函数: 1.字典定义与访问 1.1 直接定义字典: stocks = {'000001':'平安银行', '000002':'万科A'