python虚拟环境模块venv使用及示例


Posted in Python onMarch 04, 2020

相信只要学习python的同学对于虚拟环境这个概念肯定不会太陌生,虚拟环境指的是一个个单独隔离的python开发环境。各个虚拟环境之间互不干扰,都有自己独立的开发包。就像是在电脑上装了很多个虚拟机,每个虚拟机里面你随便折腾,不会影响到物理机,也不会影响到其他虚拟机。

既然这么有用,那么Python里面用来创建虚拟环境的模块virtualenv是怎么使用的呢?我们一起来看一下。

virtualenv基本命令格式

这个模块比较简单,它只有一条命令,但是跟的选项比较多,就是通过不同的选项来控制生成不同的虚拟环境。我们先来简单看一下它的基本命令格式:

virtualenv [--version] [--with-traceback] [-v | -q] [--app-data APP_DATA] [--clear-app-data] [--discovery {builtin}] [-p py] 
[--creator {builtin,cpython3-win,venv}] [--seeder {app-data,pip}] [--no-seed] [--activators comma_sep_list][--clear] 
[--system-site-packages] [--copies] [--download | --no-download] [--extra-search-dir d [d ...]] [--pip version] 
[--setuptools version] [--wheel version] [--no-pip] [--no-setuptools] [--no-wheel]
[--symlink-app-data] [--prompt prompt] [-h]
dest

乍一看,选项怎么这么多,一下子就能把人看晕,这还怎么学。但是在最开始使用的时候,常用的参数就只有下面两个:

  • -p py 用于选择python解释器版本的
  • dest 要存放虚拟环境的目录,一般是项目目录
  • --prompt prompt 设置虚拟环境命令提示符前端提示。

参数比较抽象,我们还是通过具体的例子来实践,

示例

先打开cmd命令行窗口,执行python命令,确认你的python包安装正确。如下所示:

C:\Users\Administrator>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

然后我们来安装好virualenv模块,命令是:

C:\Users\Administrator>pip install virtualenv
Looking in indexes: http://pypi.doubanio.com/simple
Collecting virtualenv
 Downloading http://pypi.doubanio.com/packages/c1/61/7506ddd79ef6f09beeefb81c4c55bf395a8ad96b33ff1c6b06e40f8aa101/virtualenv-20.0.7-py2.py3-none-any.whl (8.0 MB)
   |????????????????????????????????| 8.0 MB 6.8 MB/s
......
Installing collected packages: virtualenv
Successfully installed virtualenv-20.0.7

中间省略了一部分输出容,但是可以看到virtualenv模块安装成功。然后我们就来创建一个新的虚拟环境:

C:\Users\Administrator>virtualenv myproject
created virtual environment CPython3.7.3.final.0-64 in 6317ms
 creator CPython3Windows(dest=C:\Users\Administrator\myproject, clear=False, global=False)
 seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=C:\Users\Administrator\AppData\Local\Temp\tmpsvdy5dr2\seed-app-data\v1)
 activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

这里的虚拟环境目录名词是myproject,就这么简单的命令创建了一个虚拟环境。它位于myproject目录下。创建过程中如果没有报错就说明创建成功,同时它还指出了虚拟环境的Python版本,可以看到,就是我们系统当前安装的虚拟版本。
我们查看一下这个目录:

C:\Users\Administrator\dir myproject

2020/03/02 17:04  <DIR>     .
2020/03/02 17:04  <DIR>     ..
2020/03/02 17:04  <DIR>     Lib
2020/03/02 17:04        316 pyvenv.cfg
2020/03/02 17:04  <DIR>     Scripts

可以看到里面有两个目录和一个文件,

  • Lib目录是必须的库文件目录,
  • Scripts是虚拟环境的二进制命令文件目录以及启动器所在目录。启动器就是待会我们要用来激活虚拟环境的目录。
  • pyvenv.cfg文件是这个虚拟环境的配置文件

我们来尝试激活这个虚拟环境,命令如下:

# 切换到虚拟环境目录
C:\Users\Administrator>cd myproject

# 激活虚拟环境
C:\Users\Administrator\myproject>Scripts\activate

此时没有任何输出,而且命令提示符的窗口也没有任何改变,怎么判断虚拟环境已经激活成功了呢?我们使用pip命令来判断一下,:

C:\Users\Administrator\myproject>pip list
Package  Version
---------- -------
pip    20.0.2
setuptools 45.2.0
wheel   0.34.2

可以看到,这个时候的pip安装的包只有三个,分别是pip、setuptools、wheel。而我们实际的系统环境因为我一直在使用,我重新打开一个命令提示符窗口,直接执行pip list命令结果如下:

C:\Users\Administrator>pip list
Package      Version
------------------ ---------
-ip        19.0.3
appdirs      1.4.3
attrs       19.3.0
backcall      0.1.0
bleach       3.1.0
colorama      0.4.3
decorator     4.4.1
defusedxml     0.6.0
distlib      0.3.0
Django       2.2
....

说明我们的虚拟环境确实激活成功了,只是看起来不明显。但是这个时候虚拟环境确实已经可以使用了。那么使用完毕后该怎么退出呢?启动是activate,那么退出就是deactivate。如下所示:

C:\Users\Administrator\myproject>Scripts\deactivate.bat
C:\Users\Administrator\myproject>pip list
Package      Version
------------------ ---------
-ip        19.0.3
appdirs      1.4.3
attrs       19.3.0
backcall      0.1.0
bleach       3.1.0
colorama      0.4.3
decorator     4.4.1
defusedxml     0.6.0
distlib      0.3.0
Django       2.2
entrypoints    0.3

执行完deactivate命令后,再执行pip list命令,可以看到输出的是系统python的路径,这个时候说明已经从虚拟环境退出了。

但是这个过程确实不太明显,那么能不能把 虚拟环境弄的更明显一点呢,我们来看看--prompt这个选项的用法:

C:\Users\Administrator>virtualenv --prompt myproject2 myproject2

创建一个新的虚拟环境叫做myproject2,但是使用了--prompt myproject2的选项参数,我们再来尝试激活一下看看:

C:\Users\Administrator>cd myproject2
C:\Users\Administrator\myproject2>Scripts\activate
myproject2C:\Users\Administrator\myproject2>Scripts\deactivate.bat
C:\Users\Administrator\myproject2>

这个时候很明显就可以看到,在命令提示符前端出现了一个myproject2的提示,而当我们执行deactivate脚本后,提示符消失,说明回到了正常的环境。

这样就比较明显了。

上面的两个例子演示的是直接使用系统版本python安装的虚拟环境,既然是虚拟环境,那么python的版本能不能切换呢?我们来尝试一下-p选项的用法。

C:\Users\Administrator>virtualenv --prompt (myproject3) -p python3.8 myproject3
PEP-514 violation in Windows Registry at HKEY_LOCAL_MACHINE/PythonCore/2.7/InstallPath error: missing
RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.8'

在上面的示例中,我尝试创建以python3.8来创建myproject3这个项目,但是失败了。它在系统里没有找到python3.8的版本。
我们知道,在windows中,不同的python是可以安装在不同的目录中,但是你系统使用哪个版本,就把哪个版本的路径添加到系统的环境变量最前面即可。刚才的例子里看到我目前使用的主版本是3.7.3,这个时候如果想要使用python3.8来创建虚拟环境的话,就需要告知3.8版本的实际路径:

C:\Users\Administrator>virtualenv --prompt (myproject3) -p "D:\Program Files (x86)\Python38\python.exe" myproject3
created virtual environment CPython3.8.2.final.0-64 in 6798ms
 creator CPython3Windows(dest=C:\Users\Administrator\myproject3, clear=False, global=False)
 seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=C:\Users\Administrator\AppData\Local\Temp\tmpxuz4d8ys\seed-app-data\v1)
 activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

这个时候就可以创建成功了,这里有两点需要注意:

  1. 必须给出python.exe文件的绝对路径
  2. 路径中如果有空格,则必须使用双引号括起。

创建成功以后,我们尝试激活

C:\Users\Administrator>cd myproject3

C:\Users\Administrator\myproject3>Scripts\activate

(myproject3)C:\Users\Administrator\myproject3>python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

可以看到,确实是3.8.2版本的Python,此时新版本的虚拟环境创建成功。

基本用法就是这么两个,linux系统下的操作和这里的类似,大家可以自己去尝试一下,如果有遇到什么问题可以留言和阿飞一起讨论。

实际使用的其他参数可以看一下下面的参数解析,写的比较详细,大家可以根据自己的需要来查看。

参数解析

如果将virtualenv的所有参数进行分类,主要分为下面几类:

1. 只用于输出信息的,包括下面几个:

  • --version 输出virtualenv版本信息
  • -h, --help 输出virtualenv帮助信息
  • --with-traceback,在创建虚拟环境失败的时候,输出追踪信息。
  • -v, --verbose,设置输出信息等级,一般用于增加信息输出等级,默认值是2
  • -q, --quit,设置输出信息等级,一般用于降低信息输出等级,默认值是0

最后两个选项这里要解释一下,信息输出等级指的是virtualenv在执行命令过程中输出的信息等级,分为5个类,对应的值分别是:

  • CRITICAL 0 灾难级信息
  • ERROR 1 错误级信息
  • WARNING 2 警告级信息
  • INFO 3 普通信息
  • DEBUG 4调试信息
  • NOTEST 5 非测试信息

也就是说-q/--quit是将信息级别设置为CRITICAL,即只有灾难级信息才会输出,-v/--verbose 后面跟上对应的值,即可调整对应的信息级别。例如-v 4,即将信息级别调整为DEBUG级别。

2. 通用设置

即在使用virualenv命令的时候全局通用的配置,主要有:

  • --app-data APP_DATA 用于配置virutalenv使用的缓存目录,默认是<temp 目录>,对于windows系统通常是%USERPROFILE%\AppData\Local\Temp这个目录,对于linux系统是/tmp目录。
  • --clear-app-data virtualenv启动的时候使用空的app数据目录,默认值False,即默认使用缓存目录,便于加快虚拟环境创建。

3. 发现

发现这个配置是用来查找目标Python解释器的,当你创建虚拟环境的时候,你的虚拟环境以哪个Python解释器版本作为模板来创建呢?这个时候就需要用到发现这个组件来查找了。对应的选项有:

  • --discovery {builtin} 解释器发现方法,默认值builtin,即内置的发现组件。现在好像只有这一个可以选择。也就是说,这个选项目前对于普通用户来说没什么用。除非你能够自己实现一个发现组件。
  • -p py, --python py,用于创建虚拟环境的目标python解释器,即以这个参数指定的python解释器版本来创建虚拟环境。默认值是你当前安装virutalenv的python解释器。它有两种格式,分别是:
    • I. python解释器的绝对路径。
    • II. python版本的字符串表示,字符串的格式是{实现名称}{版本}{架构},例如python3.8.1, cpython3等。

4. 创造器(creator)

创造器在virtualenv里的作用是,实际执行虚拟环境创建过程的工具。它对应的选项有:

  • --creator {builtin, cpyhon3-win, venv},即通过哪个python解释器来创建虚拟环境,默认是builtin,即安装virtualenv的python版本。
  • dest,即安装虚拟环境的目标目录,可以使用相对路径和绝对路径
  • --clear,当目标目录存在的时候,会移除目标目录,或者覆盖目标文件,默认值False
  • --system-site-packages, 允许虚拟环境访问系统site-packages目录,默认值False
  • --copies, --always-copy,使用复制而不是链接来创建虚拟环境,即使平台的默认配置是使用链接的方式。默认值True。创建虚拟环境有两种方式,第一种是复制模板Python里的文件到虚拟环境中,第二种方式是从模板Python那里创建软链接到虚拟环境中,第二种速度更快,但是虚拟环境受到模板Python的影响也更大。因此一般推荐使用copy的方式。

5. 种子器(seeder)

种子器指的是什么呢?我们知道python的包管理软件是pip,但是还有另外两个管理软件,分别是setuptools和wheel。而种子器就是决定虚拟环境中,安装这三个软件中的哪几个。有了包管理软件,才能安装更多的包。就像种子发芽成熟后能结出更多的种子。所以叫seeder这样一个名字。对应的选项有:

  • --seeder {app-data, pip},种子包安装方法,默认值app-data,即从缓存目录里安装。
  • --no-seed, --without-pip,即不安装种子包(默认值False)
  • --download 从PyPI上下载安装最新版本的pip/setuptools/wheel,默认值False
  • --no-download, --never-download,不下载最新版的pip/setuptools/wheel,默认值True
  • --extrea-search-dir,种除了默认的Python安装的包以外,种子器可能会使用的包含其他包的路径,默认值是[]
  • --pip version, --wheel version, --setuptools version,要安装的pip,wheel,setuptools版本,默认值都是latest
  • --no-pip,--no-wheel,--no-setuptools,不安装pip,wheel,setuptools,默认值都是False
  • --symlink-app-data,从app-data目录链接python包到虚拟环境(目前还不支持,要求种子pip>=19.3,默认值False)

6. 启动器(activator)

虚拟环境配置好以后,我们怎么进入到虚拟环境,以及怎么让虚拟环境里的配置生效呢?这个时候就需要用到启动器了,启动器的作用是,在shell或者系统的环境变量里面,把虚拟环境的可执行命令路径添加到最前面。保证在虚拟环境中,最先找到的命令是虚拟环境里的命令。同样的,当虚拟环境用完以后,我们需要回到正常的环境,这个时候还需要提供虚拟环境的关闭功能。这两个功能都是在启动器里实现的。它对应的配置选项有:

  • --activator comma_sep_list, 要生成的启动器列表,用逗号分隔。因为你在不同的系统中使用的是不同的shell,例如linux中有bash、tcsh、dash、zsh等,windows中有powershell,cmd等。因此针对不同的环境需要使用不同的启动器。这个参数就是让你说明你要生成哪些环境的启动器。
  • --prompt prompt,在进入到虚拟环境的时候,一般都会在命令提示符的最前面标识出虚拟环境的名称,便于区分实际环境和虚拟环境。而这个名称就是通过这个参数来配置的。

到此这篇关于python虚拟环境模块venv使用及示例的文章就介绍到这了,更多相关python虚拟环境模块venv内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python简单文本处理的方法
Jul 10 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
对python中的xlsxwriter库简单分析
May 04 Python
python实现textrank关键词提取
Jun 22 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
创建Django项目图文实例详解
Jun 06 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
什么是python的必选参数
Jun 21 Python
python lambda的使用详解
Feb 26 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 #Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 #Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 #Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 #Python
python实现猜拳游戏
Mar 04 #Python
Python单例模式的四种创建方式实例解析
Mar 04 #Python
通过实例解析Python return运行原理
Mar 04 #Python
You might like
利用static实现表格的颜色隔行显示
2006/10/09 PHP
生成卡号php代码
2008/04/09 PHP
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python字符串string的内置方法实例详解
2018/05/14 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
关于python中remove的一些坑小结
2021/01/04 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Linux文件操作命令都有哪些
2016/07/23 面试题
How TDD works
2012/09/30 面试题
工程师岗位职责规定
2014/02/26 职场文书
党员创先争优承诺书
2014/03/26 职场文书
大学生村官个人总结
2015/02/15 职场文书
钱学森电影观后感
2015/06/04 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
Golang 链表的学习和使用
2022/04/19 Golang