可能是最全的 Python 环境管理工具对比

本文详细比较Python常用的依赖环境管理工具,值得阅读,内容包含5大块:

  1. Environment管理(主要涉及虚拟环境)
  2. Package管理
  3. Python 版本管理
  4. Package构建
  5. Package发布

背景知识

当我开始使用 Python 并创建我的第一个包时,我很困惑。创建和管理包似乎比我预想的要困难得多。此外,存在多种工具,但我不确定该使用哪一种。我相信你们大多数人过去都遇到过同样的问题。Python 有无数的工具来管理虚拟环境和创建包,但很难(或几乎不可能)了解哪一个适合您的需求。存在一些关于该主题的演讲和博客文章,但它们都没有给出完整的概述或以结构化的方式评估这些工具。这就是这篇文章的主题。

工具分类

本文划分五个对于环境和包管理方面很重要的类别:

  • Python 版本管理
  • 包管理
  • 环境管理(主要涉及虚拟环境)
  • 包构建
  • 包发布

正如下面的维恩图中所示,存在很多工具。有些是单一用途的,有些是多面手:

让我们从开发人员的角度来浏览一下这些类别:假设您同时处理个人项目和工作项目。在工作中,您使用的是 Python 3.7,而您的个人项目应该使用最新的 Python 版本(当前为 3.11)。换句话说:您希望能够安装不同的 Python 版本并在它们之间进行切换。这就是我们的第一个类别,Python 版本管理的内容。

在您的项目中,您正在使用其他软件包(例如 pandas 或 sklearn 用于数据科学)。这些是您必须安装和管理的项目的依赖项(例如,在发布新版本时进行升级)。这就是包管理的意义所在。

由于不同的项目可能需要同一包的不同版本,因此您需要创建(和管理)虚拟环境以避免依赖冲突。用于此目的的工具收集在环境管理类别中。大多数工具使用虚拟环境,但有些工具使用另一个称为 “本地包”(Local Packages) 的概念,我们稍后会讨论。

您可能希望与其他开发人员共享您的代码。为此,您首先必须构建包(包构建),然后才能将其发布到 PyPI 或其他索引(包发布)。

下面我们将更详细地了解每个类别,包括简短的定义、动机和可用的工具。我将在最后的单独部分中更详细地介绍一些单一用途工具和一些多用途工具。我们先从第一类开始:Python 版本管理。

Python版本管理

定义

一个可以进行 Python 版本管理的工具,可以让你轻松安装 Python 版本并在它们之间切换。

动机

为什么我们要使用不同的 Python 版本?有几个原因。例如,您可能正在处理多个项目,其中每个项目都需要不同的 Python 版本。或者,您可能开发一个支持多个 Python 版本的项目,并且想要测试所有版本。除此之外,检查最新的 Python 版本所提供的功能,或者测试 Python 的预发布版本是否存在错误也是不错的选择。

工具

我们的维恩图显示了可用于 Python 版本管理的工具:pyenv, conda, rye 和 PyFlow。我们将首先在单独的部分中查看 pyenv 并考虑多用途工具。

Python 自带一个单一用途的工具,可让您安装和管理 Python 版本:pyenv!Pyenv 很容易使用。最重要的命令如下:

# 安装特定版本的 Python
pyenv install 3.10.4

# 在不同的 Python 版本之间切换

# 仅针对当前 shell 切换 Python 版本
pyenv shell <version> 
# 在这个目录下,自动使用某个 Python 版本
pyenv local <version> 
# 针对当前用户,全局设定 Python 版本
pyenv global <version> 

(虚拟)环境管理

定义

环境管理工具,允许您创建和管理(虚拟)环境。

动机

为什么我们首先要使用环境?正如一开始提到的,项目有特定的要求(即它们依赖于其他包)。通常情况下,不同的项目需要同一包的不同版本。这可能会导致依赖冲突。此外,使用 pip install 安装包时可能会出现问题,因为该包与系统范围的 Python 安装一起放置。其中一些问题可以通过使用命令 --user 中的标志来解决。然而,这个选项可能并不是每个人都知道,尤其是初学者。

工具

许多工具允许用户创建和管理环境。它们是:venv, virtualenv, pipenv, conda, pdm, poetry, hatch, rye 和 PyFlow。其中只有两个是单一用途工具:venv 和 virtualenv。让我们先来看看这两个:

venv

venv(http://docs.python.org/3/library/v…) 是用于创建虚拟环境的内置 Python 包。最重要的命令如下:

# 创建一个新的环境
python3 -m venv <env_name>

# 使用这个环境
. <env_name>/bin/activate

# 关闭这个环境
deactivate

virtualenv

virtualenv (http://virtualenv.pypa.io/en/latest/)尝试改进 venv. 它提供的功能更多,速度更快,功能更强大。最重要的命令与 venv 基本一样:

# 创建一个新环境
virtualenv <env_name>

# 启用这个环境
. <env_name>/bin/activate

# 关闭这个环境
deactivate

包管理

pyproject.toml

在我们讨论打包之前,我想确保您了解打包最重要的文件:pyproject.toml.

Python 的打包已经取得了长足的进步,在 PEP 518 之前,setup.py 文件用于打包,setuptools 作为构建工具。PEP 518 引入了 pyproject.toml 文件的用法。因此,在创建包时始终需要一个 pyproject.toml 文件,用于定义项目的设置、定义元数据和许多其他内容。一个示例是 pandas 的 pyproject.toml 文件:

http://github.com/pandas-dev/

[build-system]
# Minimum requirements for the build system to execute.
# See https://github.com/scipy/scipy/pull/12940 for the AIX issue.
requires = [
    "meson-python==0.13.1",
    "meson==1.2.1",
    "wheel",
    "Cython==3.0.5",  # Note: sync with setup.py, environment.yml and asv.conf.json
    # Any NumPy version should be fine for compiling.  Users are unlikely
    # to get a NumPy<1.25 so the result will be compatible with all relevant
    # NumPy versions (if not it is presumably compatible with their version).
    # Pin <2.0 for releases until tested against an RC.  But explicitly allow
    # testing the `.dev0` nightlies (which require the extra index).
    "numpy>1.22.4,<=2.0.0.dev0",
    "versioneer[toml]"
]

build-backend = "mesonpy"

[project]
name = 'pandas'
dynamic = [
  'version'
]
description = 'Powerful data structures for data analysis, time series, and statistics'
readme = 'README.md'
authors = [
  { name = 'The Pandas Development Team', email='pandas-dev@python.org' },
]
license = {file = 'LICENSE'}
requires-python = '>=3.9'
dependencies = [
  "numpy>=1.22.4; python_version<'3.11'",
  "numpy>=1.23.2; python_version=='3.11'",
  "numpy>=1.26.0; python_version>='3.12'",
  "python-dateutil>=2.8.2",
  "pytz>=2020.1",
  "tzdata>=2022.7"
]
classifiers = [
# 省略后续

.lock 文件

还有一个对于打包很重要的文件:锁定文件(xxx.lock)。pyproject.toml 包含抽象依赖关系,锁定文件包含具体依赖关系。它记录了为项目安装的所有依赖项的确切版本(例如 pandas==2.0.3)。这使得项目在多个平台上具有可重复性,例如下面的 github.com/python-poet…:

# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.

[[package]]
name = "build"
version = "1.0.3"
description = "A simple, correct Python build frontend"
optional = false
python-versions = ">= 3.7"
files = [
    {file = "build-1.0.3-py3-none-any.whl", hash = "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f"},
    {file = "build-1.0.3.tar.gz", hash = "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b"},
]

[package.dependencies]
colorama = {version = "*", markers = "os_name == \"nt\""}
importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
packaging = ">=19.0"
pyproject_hooks = "*"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}

[package.extras]
docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"]
test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"]
typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"]
virtualenv = ["virtualenv (>=20.0.35)"]

定义

包管理工具能够下载和安装库及其依赖项。

动机

为什么我们需要包?包允许我们定义模块的层次结构并使用"."语法,例如 from package.module import my_function 轻松访问模块。此外,它们还可以轻松地与其他开发人员共享代码。由于每个包都包含一个 pyproject.toml 定义其依赖项的文件,因此其他开发人员不必单独安装所需的包,而只需从其 pyproject.toml 文件中安装该包即可。

工具

许多工具可以执行包管理:pip, pipx, pipenv, conda, pdm, poetry, rye 和 PyFlow.

其中,pip 可能是最众所周知的,它也是这里的专门只用来做包管理的工具。

Python 的标准包管理器是 pip(http://pip.pypa.io/en/stable/),它随 Python 一起提供,并允许您从 PyPI 和其他索引安装包。主要命令(可能是 Python 开发人员学习的第一个命令之一)是 pip install <package_name>

多用途工具

接下来进入非单一用途的工具

pipenv

顾名思义,pipenv 结合了 pip 和 virtualenv。它可以执行虚拟环境管理和包管理,正如我们在维恩图中看到的那样:

pipenv 引入两个附加文件:

  • Pipfile:是一个 toml 文件(类似于 pyproject.toml),用于定义项目依赖项
  • Pipfile.lock:允许确定性构建。它消除了对 requirements.txt 文件的需要,并通过锁定操作自动管理。

最重要的pipenv命令是:

# 安装某个包
pipenv install <package_name>

# 在虚拟环境运行某个脚本
pipenv run <script_name.py>

# 启用虚拟环境
pipenv shell

Conda

Conda 是一个通用的包管理系统。这意味着它不限于 Python 包。Conda 是一个具有很多功能的巨大工具。存在很多教程和博客文章(例如官方的),因此我不会在这里详细介绍。但是,我想提一件事:虽然可以构建和发布包,但 conda 我没有将该工具包含在适当的类别中。这是因为打包的 conda 工作方式略有不同,并且生成的包将是 conda 包。

特征评估

接下来我将比较不同工具的以下维度的特点:

  • 该工具是否管理依赖关系?
  • 它是否解析/锁定依赖关系?
  • 是否有干净的构建/发布流程?
  • 它允许使用插件吗?
  • 它支持 PEP 660(可编辑安装:http://peps.python.org/pep-0660/)吗?PEP 660 是关于基于构建的可编辑安装 pyproject.toml。当您使用安装软件包时,pip 您可以选择使用 pip install -e package_name 来以可编辑模式安装它。当您开发包并希望您的更改直接反映在您的环境中时,这是一个重要的功能。
  • 它支持 PEP 621(项目元数据:http://peps.python.org/pep-0621/)吗?PEP 621 指定如何在 pyproject.toml 文件中写入项目的核心元数据。我添加这个评判维度是因为一个包(剧透:它是 poetry)当前不支持此 PEP,但使用自己的方式来声明元数据。

Flit

Flit(http://flit.pypa.io/en/stable/)尝试创建一种简单的方法将 Python 包和模块放在 PyPI 上。它有一个非常具体的用例:它旨在用于打包纯 Python 包(即没有构建步骤的包)。它不关心任何其他任务:

  • Python版本管理:❌
  • 包管理:❌
  • 环境管理:❌
  • 构建包:✅
  • 发布包:✅

这也反映在我们的维恩图中:

  • 该工具是否管理依赖关系?❌
  • 它是否解析/锁定依赖关系?❌
  • 是否有干净的构建/发布流程?✅
  • 它允许使用插件吗?❌
  • 它支持 PEP 660 吗?✅
  • 它支持 PEP 621 吗?✅

主要命令有:

# 创建新的 pyproject.toml
flit init

# 构建并发布 
flit publish

Poetry

Poetry 是众所周知的工具。正如维恩图中所示,它可以执行除 Python 版本管理之外的所有操作:

  • Python版本管理:❌
  • 包管理:✅
  • 环境管理:✅
  • 构建包:✅
  • 发布包:✅

Poetry 不支持 PEP 621。GitHub 上关于此问题的开放问题已有大约 1.5 年的时间,但还是没有解决(http://github.com/python-poet…)。

  • 该工具是否管理依赖关系?✅
  • 它是否解析/锁定依赖关系?✅
  • 是否有干净的构建/发布流程?✅
  • 它允许使用插件吗?✅
  • 它支持 PEP 660 吗?✅
  • 它支持 PEP 621 吗?❌

主要命令:

# 创建目录结构和 pyproject.toml
poetry new <project_name>

# 交互式创建 pyproject.toml
poetry init

# 从 pyproject.toml 安装依赖
poetry install

依赖管理:

# Add dependency
poetry add <package_name>

# Display all dependencies
poetry show --tree
运行代码
# Activate virtual env
poetry shell

# Run script within virtual env
poetry run python <script_name.py>

锁定文件:首次安装软件包时,Poetry 会解析 pyproject.toml 文件中列出的所有依赖项并下载最新版本的软件包。一旦 Poetry 完成安装,它将所有包和下载的确切版本写入一个 poetry.lock 文件,将项目锁定到这些特定版本。建议将锁定文件提交到您的项目存储库,以便所有从事该项目的人员都被锁定到相同版本的依赖项。要将依赖项更新到最新版本,请使用以下命令:

poetry update

构建/发布流程:

# 打包 (创建 `.tar.gz` 和 `.whl`)
poetry build

# 发布到 PyPI
poetry publish 

pdm

pdm 是一个相对较新的包和依赖项管理器(于 2019 年开始),受到 Poetry 和 PyFlow 的启发。您会注意到,我在本文中并没有讨论 PyFlow。这是因为 PyFlow 不再活跃,这不再适合快速发展的打包工具领域。作为一种新工具,pdm 需要 Python 3.7 或更高版本。与其他工具的另一个区别是 pdm 允许用户选择构建后端。

pdm 是唯一在本地包上实现 PEP 582 的工具(除 PyFlow 之外) ,这是实现环境管理的替代方法。请注意,此 PEP 最近被拒绝了。

从维恩图中可以看出,pdm 位于 Poetry 旁边。这意味着它可以做除 Python 版本管理之外的所有事情:

  • Python版本管理:❌
  • 包管理:✅
  • 环境管理:✅
  • 构建包:✅
  • 发布包:✅

pdm 的主要命令与 poetry 类似。然而,目前的命令还是比较少。例如,目前没有 pdm shell 或 pdm new

  • 该工具是否管理依赖关系?✅
  • 它是否解析/锁定依赖关系?✅
  • 是否有干净的构建/发布流程?✅
  • 它允许使用插件吗?✅
  • 它支持 PEP 660 吗?✅
  • 它支持 PEP 621 吗?✅

创建一个新项目

# 交互式创建 pyproject.toml 
pdm init

# 从 pyproject.toml 安装包
pdm install

依赖管理

# 添加依赖
pdm add <package_name>

# 展示所有依赖
pdm list --graph

运行代码

# 没有 shell 命令 

# 使用当前环境运行
pdm run python <script_name.py>


锁定文件:pdm 的锁定功能与 poetry 类似。首次安装软件包时,pdm 会解析 pyproject.toml 文件中列出的所有依赖项并下载最新版本的软件包。pdm 完成安装后,会将所有包及其下载的确切版本写入文件中 pdm.lock,从而将项目锁定到这些特定版本。建议将锁定文件提交到您的项目存储库,以便所有从事该项目的人员都被锁定到相同版本的依赖项。要将依赖项更新到最新版本,请使用以下命令:

pdm update


构建/发布流程:

# 打包 (创建 `.tar.gz` 和 `.whl`)
pdm build

# 发布到 PyPI
pdm publish 

Hatch

Hatch(http://hatch.pypa.io/latest/):

  • Python版本管理:❌
  • 包管理:❌
  • 环境管理:✅
  • 构建包:✅
  • 发布包:✅

值得注意的是,Hatch 的作者承诺将很快添加锁定功能(http://github.com/pypa/hatch/…)。当您阅读本文时,请务必检查 Hatch 的最新版本,看看是否已实现此功能。

  • 该工具是否管理依赖关系?❌
  • 它是否解析/锁定依赖关系?❌
  • 是否有干净的构建/发布流程?✅
  • 它允许使用插件吗?✅
  • 它支持 PEP 660(可编辑安装)吗?✅
  • 它支持 PEP 621(项目元数据)吗?✅

创建一个新项目

# 创建目录结构以及 pyproject.toml
hatch new <project_name>

# 交互式创建项目
hatch new -i <project_name>

# 初始化现有项目或者创建 pyproject.toml
hatch new --init

依赖管理

# 没有 add 命令,依赖需要手动添加到 pyproject.toml

# 展示依赖
hatch dep show table

运行代码

# 启用虚拟环境
hatch shell

# 在虚拟环境运行脚本
hatch run python <script_name.py>

构建/发布流程

#  打包 (创建 `.tar.gz` 和 `.whl`)
hatch build

# 发布到 PyPI
hatch publish 

声明式环境管理:Hatch 的特别之处在于它允许您在文件中配置虚拟环境 pyproject.toml。此外,它还允许您专门为环境定义脚本。示例用例是代码格式化(http://hatch.pypa.io/1.1/config/…)。

Rye

Rye 最近由 Flask 框架的创建者 Armin Ronacher 开发(首次发布于 2023 年 5 月)。它受到编程语言 Rust 的打包工具 rustup 和 cargo 的强烈启发。Rye 是用 Rust 编写的,能够执行维恩图中的所有任务:

  • Python版本管理:✅
  • 包管理:✅
  • 环境管理:✅
  • 构建包:✅
  • 发布包:✅

目前,Rye 没有插件接口。但是,由于定期发布新版本,因此将来可能会添加此内容。

  • 该工具是否管理依赖关系?✅
  • 它是否解析/锁定依赖关系?✅
  • 是否有干净的构建/发布流程?✅
  • 它允许使用插件吗?❌
  • 它支持 PEP 660(可编辑安装)吗?✅
  • 它支持 PEP 621(项目元数据)吗?✅

创建一个新项目:

# 创建目录结构以及 pyproject.toml
rye init <project_name>

# 指定一个 Python 本本
rye pin 3.10

依赖管理:

# 添加依赖,但是还没有安装
rye add <package_name>

# 同步虚拟环境, 锁定文件等等
# 在这个步骤安装依赖
rye sync

运行代码:

# 启动虚拟环境
rye shell

# 使用虚拟环境运行脚本
rye run python <script_name.py>

构建/发布流程:

# 打包 (创建 `.tar.gz` 和 `.whl`)
rye build

# 发布到 PyPI
rye publish 

以上就是“可能是最全的 Python 环境管理工具对比”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文总结介绍接口测试框架开发,环境使用python3+selenium3+unittest测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman、Jmeter等接口测试工具,为什么还要开发接口测试框架呢?因接口测试工具也有存在几点不足。 * 测试数据不可控制。比如接口返回数据不可控,就无法自动断言接口返回的数据,不能断定是接口程序引起,还是测试数据变化引起的错误,所以需要做一些初始化测试数据。接口工具没有具备初始化测试数据功能,无法做到真正的接口测试自动化。 * 无法测试加密接口。实际项目中,多数接口不是可以随便调用,一般情况无法摸拟和生成加密算法。如时间戳和MDB加密算法,一般接口工具无法摸拟。 * 扩展能力不足。开源的接口测试工具无法实现扩展功能。比如,我们想生成不同格式的测试报告,想将测试报告发送到指定邮箱,又想让接口测试集成到CI中,做持续集成定时任务。 测试框架处理过程如下: * 首先初始化清空数据库表的数据,向数据库插入测试数据; * 调用被测试系统提供的接口,先数据驱动读取excel用例一行数据; * 发送请求数据,根据传参数据,向数据库查询得到对应的数据; * 将查询的结果组装成JSON格式的数据,同时根据返回的数据值与Excel的值对比判断,并写入结果至指定Excel测试用例表格; * 通过单元测试框架断言接口返回的数据,并生成测试报告,最后把生成最新的测试报告HTML文件发送指定的邮箱。 ## 测试框架结构目录介绍 目录结构介绍如下: * config/: 文件路径配置 * database/: 测试用例模板文件及数据库和发送邮箱配置文件 * db_fixture/: 初始化接口测试数据 * lib/: 程序核心模块。包含有excel解析读写、发送邮箱、发送请求、生成最新测试报告文件 * package/: 存放第三方库包。如HTMLTestRunner,用于生成HTML格式测试报告 * report/: 生成接口自动化测试报告 * testcase/: 用于编写接口自动化测试用例 * run_demo.py: 执行所有接口测试用例的主程序 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值