什么是环境

既然有所谓的 虚拟环境(Virtual Environment),那么首先有必要解释一下,什么是环境。

这里的环境,指的就是 Python 代码的运行环境。它应该包含以下信息:

  • Python 解释器,用哪个解释器来执行代码?
  • Python 库的位置,该去哪里 import 所需要的模块呢?
  • 可执行程序的位置,比如说安装了 pip,那么 pip 命令是在哪里呢?

其中第 1 个是最主要的,后面 2 个基本是围绕它确定的。

如果看了我在 安装 Python 详解 里对安装后的文件夹的说明,应该很清楚了,就是:

  • python.exe
  • Lib 文件夹,包括其中的 site-packages
  • Scripts 文件夹

sys.path

当我们说包的路径就在 Libsite-packages 文件夹里的时候,虽然大多数的情况下就是这样的,但是实际上并不准确。

包的搜寻路径是通过 Python 系统中的一个变量决定的,也就是 sys.path,我们先来打印一下看看:

>>> import sys
>>> from pprint import pprint
>>> pprint(sys.path)
['',   # 注意,别忽视了第 1 个'C:UsersDavyAppDataLocalProgramsPythonPython38python38.zip','C:UsersDavyAppDataLocalProgramsPythonPython38DLLs','C:UsersDavyAppDataLocalProgramsPythonPython38lib','C:UsersDavyAppDataLocalProgramsPythonPython38','C:UsersDavyAppDataRoamingPythonPython38site-packages','C:UsersDavyAppDataLocalProgramsPythonPython38libsite-packages']
>>>

pprint 是内置的 pretty-print 模块,可以自动换行,让打印结果好看一点。

注意:第 1 项是一个空字符串,它代表的是当前路径,也就是你启动程序的地方。比如说,我们默认情况下进入命令行就自动进入到当前用户的目录,例如 C:UsersDavy,那么当前目录就是这个。

如果你还感到疑惑,可以用下面的语句打印出绝对路径:

>>> import os.path
>>> os.path.abspath('')
'C:UsersDavy'

除了第一项,这个列表里最常用的就是最后一项,这个在 Python 安装详解 中有过说明。

什么是虚拟环境

知道了什么是环境,再来理解什么是虚拟环境就非常容易了。

简而言之,虚拟环境就是 Python 环境的一个副本。

要得到这么一个副本,首先:

  • 要给它单独找个文件夹存起来
  • 要给它取个名字

这个文件夹的名字也就是这个虚拟环境的名字,在这个文件夹下面有这些东西:

  • 一个 python.exe
  • 一个 Scripts 目录
  • 一个 Lib 目录

这里和普通环境有 2 点不一样的地方:

  • python.exe 也放在了 Scripts 目录下面(原因下面会讲)
  • Lib 目录下面只有 site-packages 目录

让我们来试一下。

venv 模块

在 Python 2.x 的时候,创建虚拟环境还需要安装第三方的 virtualenv,但是自从 Python 3.3 版本之后,标准库里内置了 venv 模块,可以用来创建虚拟环境。

在命令行中使用下面的命令来快速创建一个虚拟环境:

C:UsersDavy>python -m venv venvdemo

上面的命令会在当前目录下,新建一个名为 venvdemo 的虚拟环境。里面的文件夹:

其中 Include 基本不用管,Lib 目录下也没什么特别的,主要就是 Scripts 目录:

其中多出了 activatedeactivate 用来 激活去激活 虚拟环境。

activate 有多个后缀的文件,适配多个环境,敲命令的时候不需要带后缀

让我们来激活试试:

C:UsersDavy>venvdemoScriptsactivate

注意到一点,激活的时候我们需要指定 activate 完整的路径,因为它所在的目录并不在 PATH 环境变量之中。

激活之后,我们就进入了虚拟环境,这时候不管是执行 python 还是 pip 针对的都是虚拟环境里面的。

其实这也没什么神奇的操作,激活只不过就是把虚拟环境的 Scripts 目录临时添加到了 PATH 环境变量的第一位。

这里也解释了,为啥要把 python.exe 也放到了 Scripts 目录下,因为这样只需要加一个路径到环境变量中即可。

同时这也提醒我们注意,不是只有激活才能进入虚拟环境,我们如果把当前路径切换到了虚拟环境的 Scripts 目录下,启动 python 也是在虚拟环境中了。

继续打印一下 sys.path 看看:

(venvdemo) C:UsersDavy>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pprint import pprint
>>> import sys
>>> pprint(sys.path)
['','C:UsersDavyAppDataLocalProgramsPythonPython38python38.zip','C:UsersDavyAppDataLocalProgramsPythonPython38DLLs','C:UsersDavyAppDataLocalProgramsPythonPython38lib','C:UsersDavyAppDataLocalProgramsPythonPython38','C:UsersDavyvenvdemo','C:UsersDavyvenvdemolibsite-packages']

可以看到相对于上面普通的系统环境,最下面的两条发生了变化,注意其中的第 4 条路径 'C:UsersDavyAppDataLocalProgramsPythonPython38lib',它正是标准库的路径。

我们在执行去激活的时候,就不用再指定完整的路径了。

为什么要有虚拟环境

当我们安装一个 Python 程序或者库的时候,一般情况下我们虽然是想要安装 1 个包,比如说, pip install django。然而实际安装的都是一堆包。这些包默认都会安装到 Python 环境的 site-packages 目录下面。

下次再安装其它包时,也是如此。因为同一个库,只能在一个环境中存在一份,那么这其中如果发现了某个依赖包已经存在,只能大家公用。

这样下去,说不定哪一天这中间就出现了版本不兼容。

使用虚拟环境

因为虚拟环境的必要性,现在大多数的 Python 开发工具都支持虚拟环境的相关操作。

具体每个工具有所不同,但是一般只需要注意一点即可:指定虚拟环境中 python.exe 的位置。一旦确定了它的位置,就确定了环境的位置。也就不用每次都去激活。

“ 仔细观察,虚拟环境中的 python.exe 和系统中的 python.exe 并不完全一样。

保存虚拟环境

我们知道在使用 pip install 的时候可以通过 -r 选项指定一个 requirements 文件,这样就能批量安装所有依赖。

requirements 里面可以精确的指定安装包版本,有效地避免不兼容问题。

执行 pip freeze 可以把当前环境安装的包以 requirements 的格式输出。

(venvdemo) C:UsersDavy>pip freeze
asgiref==3.2.3
Django==3.0.3
pytz==2019.3
sqlparse==0.3.0

把输出结果保存到文件中就可以了,这样我们就精确的得到当前环境的版本信息,可以再其它地方重建这个环境。


“ 文章内容虽基础,整理发布不轻松
如果看过有帮助,不妨 点赞 + 关注,谢谢!

python 虚拟环境_理解Python虚拟环境相关推荐

  1. python 延时_理解Python多线程5:加锁解决问题,但又带来麻烦!

    此系列,已经推送的如下,还没看到的读者,可以走一波: 理解Python多线程4:代码稍作改动,bug就来了 理解Python多线程3:多线程抢夺同一个变量 理解Python多线程2:线程轮询得到CPU ...

  2. python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)

    我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...

  3. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

  4. python中元组_理解python中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  5. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  6. 什么是python语言的动态类型机制_理解Python的Dynamic typing

    Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...

  7. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  8. python在线搭建教程_理解python web开发,轻松搭建web app!

    大家好,今天分享给大家的是理解python web开发,轻松搭建web app,希望大家学有所获! 因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用 Python做web开发. ...

  9. python 监测_理解监测指标,并使用Python去监测它们

    通过学习这些关键的术语和概念来理解 Python 应用监测. 当我***次看到术语"计数器counter"和"计量器gauge"和使用颜色及标记着"平 ...

最新文章

  1. 破局传统算法痛点,腾讯安全首提基于跨模态检索的二进制代码-源代码匹配
  2. 请求体的方式传参_Angularjs中$http以post请求通过消息体传递参数的实现方法
  3. python教程:深拷贝与浅拷贝的具体区别在哪里
  4. 刷recovery工具apk_红米note4X刷lineage,不喜欢miui10广告臃肿的可以试一试
  5. 小学生们在B站讲算法,这么内卷么?
  6. idea断点的几个意思_你真的理解Intellij IDEA的Debug技巧吗?这篇文章全部教给你...
  7. 手机连接Fiddler后无法上网(已解决)
  8. 通达信交易服务器修改,GitHub - sjj6love/TdxTradeServer: TongDaXin Tarde Server 通达信交易服务器...
  9. 疯狂java笔记(七) - Java集合之Map
  10. wps 流程图 跨页_流程图跨页(wps流程图怎么制作)
  11. sentinel限流入门
  12. CG学习记录(四)函数
  13. Wt(C++ Web) 源码编译以及cmake配置
  14. php cpu占有率过高怎么办,system占用cpu过高怎么办
  15. 解决硬盘/U盘乱码的问题
  16. 如何系统学习VCU电控开发
  17. 浏览器小知识之欧朋(Opera)浏览器
  18. 来看看Jmeter官网给我们的提示之如何减少资源使用
  19. XFTP与XSHELL系统错误,缺少MSVCP110.DLL与MSVCR110.DLL解决办法
  20. 成功在德国发布应用或游戏的 6 个技巧

热门文章

  1. P6378 [PA2010] Riddle 2-sat + 前缀和优化建图
  2. Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式
  3. 斜率优化Convex Hull Trick
  4. YbtOJ#662-交通运输【线段树合并,树状数组】
  5. CF451E-Devu and Flowers【组合计数,容斥】
  6. P1941-飞扬的小鸟【dp】
  7. jzoj4252-QYQ的图【dfs】
  8. jzoj3913-艰难的选择【差分,统计】
  9. POJ2752-Seek the Name, Seek the Fame【KMP】
  10. jzoj1478-堆排序【堆】