虚拟环境
一、什么是虚拟环境 virtual environment
它是一个虚拟化,从电脑独立开辟出来的环境。通俗的来讲,虚拟环境就是借助虚拟机docker来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互相隔离,互不影响。
二、为什么需要虚拟环境
想象下面场景
在实际项目开发中,我们通常会根据自己的需求去下载各种相应的框架库,如Scrapy、Beautiful Soup等,但是可能每个项目使用的框架库并不一样,或使用框架的版本不一样,这样需要我们根据需求不断的更新或卸载相应的库。直接怼我们的Python环境操作会让我们的开发环境和项目造成很多不必要的麻烦,管理也相当混乱。如一下场景:
场景1:项目A需要某个框架1.0版本,项目B需要这个库的2.0版本。如果没有安装虚拟环境,那么当你使用这两个项目时,你就需要 来回 的卸载安装了,这样很容易就给你的项目带来莫名的错误;
场景2:公司之前的项目需要python2.7环境下运行,而你接手的项目需要在python3环境中运行,想想就应该知道,如果不使用虚拟环境,这这两个项目可能无法同时使用,使用python3则公司之前的项目可能无法运行,反正则新项目运行有麻烦。而如果虚拟环境可以分别为这两个项目配置不同的运行环境,这样两个项目就可以同时运行。
深度学习中使用虚拟环境有几个重要原因:
-
隔离环境:虚拟环境允许你在不同的项目之间隔离依赖和库。这对于深度学习项目尤其重要,因为不同项目可能需要不同版本的库或依赖项。通过创建虚拟环境,你可以确保每个项目都有独立的环境,避免了版本冲突和不必要的干扰。
-
版本控制:深度学习框架和库经常更新,而且不同版本之间可能存在不兼容性。使用虚拟环境可以确保你的项目在特定版本的库上运行,从而避免了由于库更新而导致的问题。
版本的升级,意味着内部实现原理的改变,而这意味兼容性的问题。最直观的例子就是,假设原先的一个方法,它的语法完全变了,而这时候如果你集成了多个第三方库,而每个第三方库只支持特定版本及以上的Python特性,兼容性的复杂程度将成几何形成长。这还只是一个项目,当多个项目引用的虽然是同一个第三方库,可是它们依赖的是不同的版本,怎么办?虚拟环境就是创建了一个专属空间,当前项目的所有依赖,都从这个专属空间里引用,即 专属的第三方库,专属的指定版本。专属空间,才是虚拟环境的意义所在。 -
依赖管理:虚拟环境允许你明确指定项目所需的依赖项。这样,你可以轻松地安装、升级或删除特定的库,而不会影响其他项目。
三、Anaconda创建、激活、退出、删除虚拟环境
在Anaconda中conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。所以对虚拟环境进行创建、删除等操作需要使用conda命令。
创建虚拟环境
使用 conda create -n your_env_name python=X.X(2.7、3.6等),anaconda 命令创建python版本为X.X、名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装目录envs文件下找到。 指定python版本为2.7,注意至少需要指定python版本或者要安装的包, 在不指定python版本时,自动安装最新python版本。
conda create -n env_name python=2.7
同时安装必要的包
conda create -n env_name numpy matplotlib python=2.7
激活虚拟环境
使用如下命令即可激活创建的虚拟环境
Linux: source activate your_env_name(虚拟环境名称)
Windows: activate your_env_name(虚拟环境名称)
此时使用python --version可以检查当前python版本是否为想要的(即虚拟环境的python版本)。
退出虚拟环境
使用如下命令即可退出创建的虚拟环境
Linux: source deactivate your_env_name(虚拟环境名称)
Windows: deactivate env_name,也可以使用activate root切回root环境
删除虚拟环境
删除环境:
使用命令conda remove -n your_env_name(虚拟环境名称) --all, 即可删除。
删除虚拟环境中的包:
使用命令conda remove --name $your_env_name $package_name(包名)即可。
分享环境
如果你想把你当前的环境配置与别人分享,这样ta可以快速建立一个与你一模一样的环境(同一个版本的python及各种包)来共同开发/进行新的实验。一个分享环境的快速方法就是给ta一个你的环境的.yml文件。首先通过activate target_env要分享的环境target_env,然后输入下面的命令
conda env export > environment.yml
会在当前工作目录下生成一个environment.yml文件,小伙伴拿到environment.yml文件后,将该文件放在工作目录下,可以通过以下命令
conda env create -f environment.yml
从该文件创建环境,.yml是这个样子的
conda常用命令
conda list:查看安装了哪些包。
conda install package_name(包名):安装包
比如:
conda install --channel https://conda.anaconda.org/menpo opencv3 :安装opencv
conda install scikit-learn:安装sklearn
conda install tensorflow-gpu:安装GPU版本的tensorflow
conda install keras:安装keras
conda env list 或 conda info -e:查看当前存在哪些虚拟环境
conda update conda:检查更新当前conda
conda系列工具的区别
anaconda、miniconda和conda
1. Anaconda
Anaconda是一个包含180+的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。
2. conda
conda 是Anaconda 中的一个组件,用于安装和管理软件包。
conda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换
-
适用语言:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。
-
适用平台:Windows, macOS, Linux
-
用途:
快速安装、运行和升级包及其依赖项。
在计算机中便捷地创建、保存、加载和切换环境。
如果你需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。——Conda官方网站
-
conda为Python项目而创造,但可适用于上述的多种语言。
-
conda包和环境管理器包含于Anaconda的所有版本当中。
3. Miniconda
Miniconda 作为 Anaconda 的轻量版,Miniconda 和 Anaconda 之间的主要区别就在于Anaconda 包含了许多科学计算和数据分析用的包,而 Miniconda 只包含了最基本的包和工具如果你只需要安装最基本的包和工具,并且希望节省空间,那么 Miniconda 可能是一个不错的选择。如果你需要许多科学计算和数据分析用的包,那么 Anaconda 可能是一个更好的选择。
conda、pip、virtualenv的区别
1. pip
pip是用于安装和管理软件包的包管理器。
-
pip编写语言:Python。
-
Python中默认安装的版本:
① Python 2.7.9及后续版本:默认安装,命令为 pip
② Python 3.4及后续版本:默认安装,命令为 pip3 -
pip名称的由来:pip采用的是递归缩写进行命名的。其名字被普遍认为来源于2处:
①Pip installs Packages(“pip安装包”)
②Pip installs Python(“pip安装Python”)
2. virtualenv
virtualenv是用于创建一个独立的Python环境的工具。
-
解决问题:
当一个程序需要使用Python 2.7版本,而另一个程序需要使用Python 3.6版本,如何同时使用这两个程序?如果将所有程序都安装在系统下的默认路径,如:/usr/lib/python2.7/site-packages,当不小心升级了本不该升级的程序时,将会对其他的程序造成影响。
如果想要安装程序并在程序运行时对其库或库的版本进行修改,都会导致程序的中断。
在共享主机时,无法在全局 site-packages 目录中安装包。 -
virtualenv将会为它自己的安装目录创建一个环境,这并不与其他virtualenv环境共享库;同时也可以选择性地不连接已安装的全局库。
3. pip 与 conda 比较
(1) 依赖项检查
-
pip:
① 不一定会展示所需其他依赖包。
② 安装包时或许会直接忽略依赖项而安装,仅在结果中提示错误。 -
conda:
① 列出所需其他依赖包。
② 安装包时自动安装其依赖项。
③ 可以便捷地在包的不同版本中自由切换。
(2) 环境管理
-
pip:维护多个环境难度较大。
-
conda:比较方便地在不同环境之间进行切换,环境管理较为简单。
(3) 对系统自带Python的影响
-
pip:在系统自带Python中包的更新/回退版本/卸载将影响其他程序。
-
conda:不会影响系统自带Python。
(4) 适用语言
-
pip:仅适用于Python。
-
conda:适用于Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。
4. conda与pip、virtualenv的关系
conda结合了pip和virtualenv的功能。
anaconda和docker
Anaconda和Docker是两个不同的工具,但在某些方面解决了类似的问题。
Anaconda:
-
用途:Anaconda是一个虚拟环境管理工具和软件包管理工具。它主要用于创建和管理Python环境,使得在不同版本的Python下开发应用程序成为可能。
-
优点:Anaconda可以帮助你创建独立的运行环境,每个环境都可以有不同的Python版本和包。
-
适用场景:如果你只需要在Python环境级别隔离,例如支持多个PyTorch版本,那么Anaconda足够满足需求。
Docker:
-
用途:Docker是一个容器管理工具,可以创建一个与当前操作系统隔离的环境。它允许你在容器内运行应用程序,而不受操作系统的影响。
-
优点:Docker可以解决多人使用一台服务器时的软件版本和系统配置冲突问题。它提供了“一次编译到处运行”的能力,使得容器镜像可以在不同的物理机上运行。
-
适用场景:
如果你需要在分发应用程序时在多台不同的物理机上配置运行环境,使用Docker更方便。
当物理机数量超过10台且需要通信或协同工作时,考虑使用Kubernetes(K8s)。
总之,如果你只需要简单地在不同Python环境之间切换,使用Anaconda;如果你需要更强大的隔离和部署能力,使用Docker
conda 和 docker 是两个毫不相关的东西
- conda 是包管理器,可以用来安装 Python 包,管理 Python 环境。
- docker (docker engine) 是容器管理工具,简单来讲可以创建一个和当前操作系统隔离的环境。
两者使用没有什么共同点。
概念上的共同点,可能只是创建一个“隔离环境”:conda 是在 Python 环境级别隔离,docker 是在操作系统上隔离。就算是使用 docker 创建了操作系统的隔离环境,也依然需要用 conda 或 pip 等包管理器在容器内配置好 Python 环境后才能跑代码。
关于 conda “虽然可以复制环境,但是难免会出现一些奇怪的问题”,我表示震惊。
- 不会真有人直接把整个 env 拷到别的系统上吧……
- 出问题大概率是 conda 环境脏了,包括但不仅限于:使用 conda 之外的包管理器装了包;魔改了环境里的东西;驱动(如 CUDA 版本)在不同机器上不一样;环境变量的配置有问题等等
- 只要环境里的所有包都是 conda 安装的,并用 conda list --export > requirements.txt 导出环境,基本上可以装出一致的环境。
五、在Linux中设置conda时需要注意的一个问题
装 aconda 后ubuntu系统终端界面前部出现(base)字样
不想一直看着(base)怎么解决
1.打开一个终端 ,输入命令:gedit ~/.bashrc
2.在 .bashrc文件最后面添加命令:conda deactivate
再重新打开终端即可消除base字样
若在终端中输入conda deactivate,也可消除base字样,但是一次性的,再次打开终端依然存在base字样。在.bashrc文件添加命令conda deactivate可以永久消除base字样。
浙公网安备 33010602011771号