python 虚拟环境_理解Python虚拟环境

bbe2f38949670f6b79edfdd6bff03724.png

什么是环境

既然有所谓的 虚拟环境(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 的虚拟环境。里面的文件夹:

ebb33da60154fdf34f0d677231ab0508.png

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

687278b03a305318f136a0e395d9f505.png

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

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

让我们来激活试试:

C:UsersDavy>venvdemoScriptsactivate

9328f01517575eb9aad5af88fedaa01a.gif

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

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

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

56d0da0ae97665badfbcc18fd14466f2.png

这里也解释了,为啥要把 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 目录下面。

f55d6796afeac89fb3f6a793aeb814cc.png

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

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

使用虚拟环境

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

eb2468bfc59091d9b59a45f4645e98c6.png

具体每个工具有所不同,但是一般只需要注意一点即可:指定虚拟环境中 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

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


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

c2550e633db21a8a103b6ceb6206e4e5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.util.concurrent.locks.Lock文档说明

【1】Lock接口文档描述 1.相比于使用synchronized方法和代码块,锁的出现提供了更广泛的锁操作。 锁允许更灵活的代码结构,具有许多不同的属性,还支持多个关联的Condition条件对象。 2.锁是用于控制多个线程访问共享资源的工具。通常&#…

20 个使用 Java CompletableFuture的例子

转载自 20 个使用 Java CompletableFuture的例子这篇文章介绍 Java 8 的 CompletionStage API和它的标准库的实现 CompletableFuture。API通过例子的方式演示了它的行为,每个例子演示一到两个行为。既然CompletableFuture类实现了CompletionStage接口,首…

fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表

原创: 老表 简说Python 今日问题 :翻转链表k个相邻结点"""目标:写一段程序,合并两个有序链表例如:输入-> 1->2->3输入-> 2->5->6->8输出-> 1->2->2->3->5->6-&…

java.util.concurrent.locks.Condition文档说明

【1】Condition接口文档描述 1.Condition类把Object监视器方法(wait,nofify, notifyAll)分解为不同对象,通过与Lock实现类的合并使用,Condition可以产生每个object都有多个等待集的效果。在Lock实现类替代synchronized方法或语句…

谈谈HashMap线程不安全的体现

转载自 谈谈HashMap线程不安全的体现HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了。那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢?1. resize死循环我们都知道…

手机打开python文件_使用python在计算机和手机之间通过wifi进行简单的文件传输...

我会使用 paramiko.它安全快速而且非常简单.怎么回事? 所以我们首先导入模块,然后指定日志文件: import paramiko paramiko.util.log_to_file(/tmp/paramiko.log) 我们打开一个SSH传输: host "example.com" port 22 transport p…

10人以下小团队管理手册-学习笔记

【README】 本文总结于《10人以下小团队管理手册》,很nice的一本书,有兴趣的同学可以翻下; 【0】序章 作者作为咨询师发现, 1.下属对主管有不满,主管对下属有怨言; 2.10人以下小团队主管经常会为 如何用…

JavaWeb项目:简易小米商城系统

Web项目:MyShop简易小米商城系统一.系统概述二.系统开发环境三.涉及技术四.系统功能及使用说明五.作者杂谈六.尾声七.gitee地址:(源码见文末) 一.系统概述 本系统是一个电商系统,可供用户注册,登录&#…

HashMap的实现与优化

转载自 HashMap的实现与优化HashMap的优化与实践 本文是基于作者在github上的Android 问题交流讨论坛提问而产生的一篇文章,也是自己早打算开坑的一篇文章。文章首先介绍了hashMap的一些基本知识,然后介绍了它在JDK8下的实现原理,最后着重介绍…

如何确定python开发环境已经配置好_搭建 python 开发环境 前面安装选位置我直接回车了现在我想测试查看目录该怎么办...

展开全部 1 ubuntu中一般安装e5a48de588b662616964757a686964616f31333431343036后的默认路径如下#!/usr/bin/env python #!/usr/locat/bin/python 如果没有找到,可以通过命令查询python路径whereis python which python 2 Windows一般可以进入python>>> i…

转- java单例模式几种实现方式

转自: https://www.cnblogs.com/ngy0217/p/9006716.html ; 单例模式的五种实现方式 1、饿汉式(线程安全,调用效率高,但是不能延时加载): 1 2 3 4 5 6 7 public class ImageLoader{ private static ImageLoade…

IDEA集成maven流程图详细介绍

前言 最近利用两天时间学习了MyBatis以及maven,避免经典的学过就忘记,我打算做出点总结以便日后复习,当然如果能帮到需要的人也是极好的。 一. 初识maven 1.maven是什么 maven是用来帮助我们快速搭建项目结构与开发环境的好工具。回想一下每次新建项…

pythonnumpy教程_Python教程:numpy的基本介绍

标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显…

Java8系列之重新认识HashMap

转载自 Java8系列之重新认识HashMap简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做…

mysql-on duplicate key update实现insertOrUpdate官方文档

【README】 mysql 基于 on duplicate key update filedvalue ; 实现有则更新,没有则插入; 以下内容总结于 https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html 【1】api 描述 如果指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行…

python统计段落单词词频_使用Python统计文件中词频,并且生成词云

wordcloud Table of Contents 1 怎样使用Python产生词云 from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba # Now, There is no word.txt under this path path_txt "/home/alan/Desktop/word.txt" f open(path_txt, r, encoding U…

IDEA中maven配置MyBatis简单流程

前言 刚学完javaweb,对自己的Dao层代码很不满意的话,可得来学学MyBatis。学习MyBatis既可以改进JDBC的使用,实现Dao层也会变得很简便,下面我将介绍IDEA中maven配置MyBatis简单流程。 如果想了解maven请转到我的上一篇文章中&…

(转)构建微服务:Spring boot 入门篇

转自: Spring Boot(一):入门篇 - 纯洁的微笑 - 博客园 ; 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#…

python参数_python参数的介绍

一、函数 1.为什么要使用函数? 减少代码的冗余 2.函数先定义后使用(相当于变量一样先定义后使用) 3.函数的分类: 内置函数:python解释器自带的,直接拿来用就行了 自定义函数:根据自己的需求自己…

一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)

前言 过了web这个阶段了,项目也完成了的我想给各位后来者总结一下我整个项目从开始到结束的经验,当然,也不是一帆风顺,报错有时候折磨的要死,废话不多说,现在就开始吧。 本文一共分为两个部分:…