Python 入门(二、什么是 Python 的虚拟环境)

Python 入门第二课 ,Python 的虚拟环境...... by 矜辰所致

前言

本来以为环境搭建好了,就直接开始敲代码了,但是一直看到一个专业词汇:虚拟环境。

对于习惯了嵌入式 C 语言开发博主来说,一开始确实有点不明白,特意花了一些时间去了解,也算是有了一定的了解。

那本文的内容就是来讲讲什么是 Python 的虚拟环境。

对于我们单纯学习 Python 来说,虚拟环境不是必须的,学习的时候直接在系统真实环境中操作也是没问题的,只是学会使用虚拟环境对于今后的应用来说是必须的。

Python 入门系列文章:
Python 入门(一、使用 VSCode 开发 Python 环境搭建)
.
我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

目录

  • 前言
  • 一、Python 开发的虚拟环境
  • 1.1 什么是虚拟环境
  • 1.2 为什么要虚拟环境
  • 二、创建虚拟环境
  • 2.1 常用工具
  • 2.1.1 Conda 与 Venv 对比
  • 2.2 创建虚拟环境
  • 结语
  • 一、Python 开发的虚拟环境

    1.1 什么是虚拟环境

    Python 的虚拟环境是一个用于创建隔离的 Python 环境的工具。它允许你为不同的项目安装不同的依赖,而不会相互冲突。

    虚拟环境可以包含自己独立的 Python 解释器、库和工具,它们与系统 Python 真实环境是分开的。

    对于初学者来说,上面的解释或许还是会有些迷糊,要搞清楚什么是虚拟环境,我们首先要清楚 Python 的真实环境是怎样的。

    我们从最开头说起,我们运行一个简单的 python 程序,使用 python hello.py 执行程序,这个 python 哪里来的,程序中import 的模块在哪里来的:

  • python 命令可以执行,是因为我们安装时候添加了环境变量 PATH,当我们在命令行中运行程序时,系统会根据PATH配置的路径列表依次查寻是否有可执行文件 python ,所以可以执行 python 命令。
  • 程序中 import 的模块怎么来的呢?
    import的模块包含两类,一类称为标准库(类似于 C语言标准库一样的),随着python的安装而安装;
    另一类称为第三方库,使用 pip 工具或者自己手动安装的包。
  • 程序得以运行时因为存在必要的环境,这里我们称之为 Python 真实环境,如下图:

    ( 参考了某园博主:救苦救难韩天尊 的 Python 相关文章的示意图 )

    那么虚拟环境呢,可以理解为把真实环境复制了一份,供项目单独使用。但不是全部复制,其中 Python 标准库非常大,把标准库复制到虚拟环境不太实际,其实除了大小问题,还有包括安全性,一致性等问题,标准库是 Python 安全模型的一部分,复制标准库可能会导致安全问题,标准库中的模块是与 Python 解释器紧密相关的。每个 Python 版本都有特定版本的标准库,这些模块通常与解释器的内部实现相匹配。使用全局解释器的标准库可以确保一致性和兼容性。

    所以 虚拟环境不包含标准库,还有虚拟环境把 python.exe 放到了 Scripts 目录下,如下图的虚拟环境目录结构:

    1.2 为什么要虚拟环境

    为什么要虚拟环境?

    在进行 Python 实际项目开发时,我们需要根据需求下载不同的库。如果一个项目需要库 A 的1.0 版本,而另一个项目需要 库 A 的 2.0 版本。如果我们在全局环境中,安装 A 的1.0 版本和2.0 版本,可能出现版本冲突,或许只能存在一个版本、那我们也不可能在用第一个项目的时候安装 1.0版本,然后到第二个项目的时候卸载 1.0 版本,安装 2.0 版本,这样不断的更新或卸载相应的库的开发工作及其混乱。

    这个时候 Python 虚拟环境就能发挥它的作用,为每个项目提供一个互不干扰的 Python 运行环境。

    综合来说,Python 开发使用虚拟环境的好处如下:

  • 环境隔离:
    虚拟环境允许开发者为每个项目创建一个独立的环境,其中包含自己的 Python 版本和依赖库。这样可以防止不同项目之间的依赖冲突。
  • 依赖管理:
    在虚拟环境中,你可以自由地安装、卸载和升级库,而不会影响到全局 Python 环境或其它项目。
  • 版本控制:
    虚拟环境使得开发者可以为特定项目指定特定版本的库,即使这些版本在全局环境中不可用或与其它项目不兼容。
  • 安全性:
    通过隔离环境,可以减少全局环境中安装的库带来的安全风险。
  • 开发与生产环境一致性:
    虚拟环境确保了开发环境与生产环境的一致性,有助于减少“在我的机器上可以运行”的问题。
  • 易于共享和复现:
    虚拟环境可以通过 requirements.txt 文件或其它方式轻松地在不同机器或开发者之间共享,其他人员可以根据这份文件在各自的虚拟环境中一键安装相同版本的依赖,确保代码在各个开发环境中表现一致,使得项目更容易被其他人理解和复现。
  • 简化部署:
    在部署应用时,虚拟环境可以简化部署过程,因为只需要复制环境和代码,而不需要关心服务器上的全局 Python 环境。
  • 测试和调试:
    在虚拟环境中,开发者可以更容易地测试不同版本的库,以及在隔离的环境中调试问题。
  • 二、创建虚拟环境

    2.1 常用工具

    在 Python 开发中,创建虚拟环境可以使用多种工具,实际上作为我们初学者来说,首先就使用好一种就好了,但是这里提到了,我们就简单了解一下:

    venv:

    这是 Python 自带的虚拟环境管理工具,从 Python 3.3 版本开始内置于标准库中。
    它创建轻量级的虚拟环境,每个环境拥有自己的 Python 解释器和一套独立的 Python 库。
    使用方法简单,
    如 python -m venv myenv 创建环境,
    使用
    source myenv/bin/activate(Linux/macOS)

    myenv\Scripts\activate(Windows)激活环境。

    virtualenv:

    在 Python 3.3 之前,virtualenv 是创建虚拟环境的事实标准工具。
    它允许用户创建多个隔离的 Python 环境,并且可以为每个环境选择不同的 Python 版本。
    通过 pip install virtualenv 安装,
    然后使用 virtualenv myenv 创建环境。

    pipenv:

    pipenv 是一个相对较新的工具,它结合了 pip 和 virtualenv 的功能,自动处理依赖和虚拟环境。
    它使用 Pipfile 和 Pipfile.lock 来管理依赖,确保了更好的可重复性和更清晰的依赖关系。
    通过 pip install pipenv 安装,
    然后使用 pipenv install 来创建并管理环境。

    conda:

    conda 是一个功能强大的包和环境管理器,它是 Anaconda 发行版的一部分,但也可以在Miniconda 中独立使用。
    conda 可以管理 Python 和其他语言的包,非常适合数据科学和机器学习项目。
    它支持创建隔离的环境,并且可以处理复杂的依赖关系。
    使用 conda create –name myenv python=3.8 创建环境,
    使用 conda activate myenv 激活环境。

    pyenv:

    pyenv 是一个用于管理多个 Python 版本的工具,它允许用户在同一台机器上安装和管理多个 Python 版本。
    它不是虚拟环境管理工具,而是一个版本管理工具,但它可以与 virtualenv 或 conda 结合使用。
    通过 git clone https://github.com/pyenv/pyenv.git ~/.pyenv 安装,
    然后使用 pyenv install 3.8.0 安装特定版本的 Python。

    这些工具各有特点,选择哪个工具取决于你的具体需求,比如项目复杂度、是否需要管理非Python依赖项、是否需要跨平台支持等。对于大多数Python项目,venv 和 pipenv 通常是首选,因为它们简单且足以满足大多数需求。如果你在数据科学领域工作,可能会更倾向于使用 conda。

    2.1.1 Conda 与 Venv 对比

    这里为什么单独拿 Conda 与 Venv 对比,是因为我们使用 VSCode 开发时候,创建虚拟环境的时候,默认是在这两种工具中选择:

    所以我们单独说明一下这两者的区别:

    1. 创建虚拟环境的命令不同

    2. 使用venv创建虚拟环境,可以使用 Python 内置的venv模块。例如,在 Windows 上使用命令python -m venv myenv,在 Linux/macOS 上使用python3 -m venv myenv
    3. 使用conda创建虚拟环境,需要使用conda create --name myenv python=3.8这样的命令。
    4. 包管理系统不同

    5. venv创建的虚拟环境使用 Python 的标准包管理系统pip来安装和管理包。
    6. conda创建的虚拟环境使用conda自己的包管理系统来安装和管理包,也可以使用pip
    7. 平台无关性

    8. venv是 Python 的标准库模块,因此在 Python 的不同平台上都可以使用,不依赖于任何特定的包管理器。
    9. conda是一个跨平台的包管理系统,可以在 Windows、Linux 和 macOS 等操作系统上使用。
    10. 生态系统不同

    11. venv创建的虚拟环境通常更轻量级,适用于纯 Python 项目,主要用于管理 Python 包,不适合管理非 Python 依赖项。
    12. conda是一个更强大的生态系统,可以管理 Python 包以及其他语言的包和依赖项,更适合复杂的项目,特别是涉及到多种语言或非 Python 依赖项的项目。
    13. 适用场景

    14. 如果你的项目是纯 Python 项目,并且希望使用 Python 的标准包管理工具,那么使用venv是一个不错的选择。
    15. 如果你需要更强大的包管理和跨语言支持,以及更丰富的生态系统,那么conda可能更适合你的需求。
    16. 性能和资源占用

    17. venv在处理纯 Python 项目时更为轻量和快速,占用的磁盘空间和内存通常低于conda
    18. conda由于旨在管理多个语言的环境,其占用的磁盘空间和内存通常高于venv,特别是安装Anaconda时,预装的众多科学包会占用相当的空间。
    19. 社区支持和资源

    20. venv作为Python的内置模块,享受着Python官方的支持,有广泛的社区支持和资源。
    21. conda拥有一个活跃的开发者和用户社区,尤其是在数据科学和科学计算领域,有强大的支持和丰富的资源。

    总的来说,选择 venv 还是 conda 应基于你的具体项目需求、个人偏好以及所需的功能复杂度。理解这两个工具的优势和局限性,可以帮助你做出更明智的决策。

    这里推荐一篇文章有具体的说明两者之间的区别:

    Conda对比Venv:谁是Python环境管理的王者?

    2.2 创建虚拟环境

    我们做了简单的了解,回到我们的 VSCode 环境中,我们自己来操作一下,创建一个虚拟环境试试。

    我们打开 VSCode 的命令面板(Ctrl + Shift + P),输入 “Python”,找到创建环境的选项,如下图:

    选择创建虚拟环境,就会弹出下面界面,让我们选择是使用 Venv 还是 Conda ,这里还要注意,这里选择虚拟环境是在当前目录下面,要注意自己处在的目录

    这里测试呢,我们直接选择第一个 Venv 工具(因为这是 Python 自带的工具,如果选择下面的 Conda,我们并没有安装过还会提示你需要安装 Conda ,也创建不了 ),

    会弹出版本选择,因为电脑上只安装一个版本的 Python ,所以这里治愈后一个选项,前面的五角星表示推荐的版本:

    点击版本都就自动创建好了一个虚拟环境,创建完成以后和以前会有一些变化,如下图:

    虽然我们上面介绍虚拟环境的时候,讲到了 venv 用什么指令创建,用什么指令激活,

    但是在 VSCode 创建的虚拟环境,它会自动激活,直接使用就可以了。

    编译的效果如下图:

    这里虚拟环境的适用范围, 我们创建的时候是在当前目录下面,在上图中就是Python_Project 这个文件夹,等于在这个文件夹下面的 .py 文件,都会使用我们新建的这个虚拟环境。

    所以我们并不需要把 hello.py ,放到 .venv 文件夹下面,当然放进去,也是可以正常运行的:

    但是我们上一节课讲到过在 VSCode 中 Python 程序的调试,我们需要用到 .vscode 中的配置, .vscode 需要和需要调试的 hello.py 在同级目录,才能正常的使用调试功能。

    结语

    本文我们详细的了解了一下 Python 的虚拟环境,我们知道了虚拟环境在 Python 开发中的重要用途。也知道了如何在 VSCode 中创建 Python 的虚拟环境,在今后我们的基础学习过程中,都会在今天创建的虚拟环境下进行了。

    那从下节课开始,我们就可以开始 Python 的基础语法学习了。

    好了,本文就到这里,谢谢大家!

    作者:矜辰所致

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 入门(二、什么是 Python 的虚拟环境)

    发表回复