python 虚拟环境_理解Python虚拟环境
什么是环境
既然有所谓的 虚拟环境(Virtual Environment),那么首先有必要解释一下,什么是环境。
这里的环境,指的就是 Python 代码的运行环境。它应该包含以下信息:
- Python 解释器,用哪个解释器来执行代码?
- Python 库的位置,该去哪里
import
所需要的模块呢? - 可执行程序的位置,比如说安装了
pip
,那么pip
命令是在哪里呢?
其中第 1 个是最主要的,后面 2 个基本是围绕它确定的。
如果看了我在 安装 Python 详解 里对安装后的文件夹的说明,应该很清楚了,就是:
python.exe
Lib
文件夹,包括其中的site-packages
Scripts
文件夹
sys.path
当我们说包的路径就在 Lib
和 site-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
目录:
其中多出了 activate
和 deactivate
用来 激活 和 去激活 虚拟环境。
“
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虚拟环境相关推荐
- python 延时_理解Python多线程5:加锁解决问题,但又带来麻烦!
此系列,已经推送的如下,还没看到的读者,可以走一波: 理解Python多线程4:代码稍作改动,bug就来了 理解Python多线程3:多线程抢夺同一个变量 理解Python多线程2:线程轮询得到CPU ...
- python数据采集仪_数据采集卡支持python么深入理解Python生成器(Generator)
我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,而且如果我们仅仅需要访问前面几个元素,那后面绝大多 ...
- 第一章 第一节:Python基础_认识Python
Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...
- python中元组_理解python中的元组
理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...
- c++ 协程_理解Python协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- 什么是python语言的动态类型机制_理解Python的Dynamic typing
Python的Dynamic typing有些类似于C语言的指针,在C中,一个变量可以指向任何地址空间,在Python中,一个变量也可以指向任何type的数据对象.变量的指向可以在程序运行过程中变化, ...
- python3 协程 写法_理解Python的协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- python在线搭建教程_理解python web开发,轻松搭建web app!
大家好,今天分享给大家的是理解python web开发,轻松搭建web app,希望大家学有所获! 因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用 Python做web开发. ...
- python 监测_理解监测指标,并使用Python去监测它们
通过学习这些关键的术语和概念来理解 Python 应用监测. 当我***次看到术语"计数器counter"和"计量器gauge"和使用颜色及标记着"平 ...
最新文章
- 破局传统算法痛点,腾讯安全首提基于跨模态检索的二进制代码-源代码匹配
- 请求体的方式传参_Angularjs中$http以post请求通过消息体传递参数的实现方法
- python教程:深拷贝与浅拷贝的具体区别在哪里
- 刷recovery工具apk_红米note4X刷lineage,不喜欢miui10广告臃肿的可以试一试
- 小学生们在B站讲算法,这么内卷么?
- idea断点的几个意思_你真的理解Intellij IDEA的Debug技巧吗?这篇文章全部教给你...
- 手机连接Fiddler后无法上网(已解决)
- 通达信交易服务器修改,GitHub - sjj6love/TdxTradeServer: TongDaXin Tarde Server 通达信交易服务器...
- 疯狂java笔记(七) - Java集合之Map
- wps 流程图 跨页_流程图跨页(wps流程图怎么制作)
- sentinel限流入门
- CG学习记录(四)函数
- Wt(C++ Web) 源码编译以及cmake配置
- php cpu占有率过高怎么办,system占用cpu过高怎么办
- 解决硬盘/U盘乱码的问题
- 如何系统学习VCU电控开发
- 浏览器小知识之欧朋(Opera)浏览器
- 来看看Jmeter官网给我们的提示之如何减少资源使用
- XFTP与XSHELL系统错误,缺少MSVCP110.DLL与MSVCR110.DLL解决办法
- 成功在德国发布应用或游戏的 6 个技巧
热门文章
- P6378 [PA2010] Riddle 2-sat + 前缀和优化建图
- Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式
- 斜率优化Convex Hull Trick
- YbtOJ#662-交通运输【线段树合并,树状数组】
- CF451E-Devu and Flowers【组合计数,容斥】
- P1941-飞扬的小鸟【dp】
- jzoj4252-QYQ的图【dfs】
- jzoj3913-艰难的选择【差分,统计】
- POJ2752-Seek the Name, Seek the Fame【KMP】
- jzoj1478-堆排序【堆】