Python 项目及依赖管理工具,类似于 Java 中的 Maven 与 Node 中的 npm + webpack,在开发和维护项目时起着重要的作用。使用适当的依赖管理工具可以显著提高开发效率,减少依赖冲突,确保项目的稳定性、可靠性和安全性。

一、常见项目及依赖管理工具需具备的功能

1. 依赖管理

(1)自动化依赖安装

依赖管理工具可以自动安装项目所需的所有依赖包,而不需要手动逐个安装。

(2)依赖版本控制

这些工具允许开发者指定和锁定依赖包的版本,确保项目在不同环境中运行时依赖的一致性

2. 虚拟环境管理

虚拟环境允许在同一台机器上运行多个项目,而不会发生依赖冲突。依赖管理工具通常会自动创建和管理虚拟环境,确保项目依赖的隔离性。

3. 依赖冲突解决

依赖管理工具可以自动解决依赖冲突,确保安装的依赖包版本兼容。例如,pipenvpoetry 都有内置的依赖冲突解决机制。

4. 安全性检查

一些工具(如 pipenv)提供了内置的安全性检查功能,可以扫描依赖包的已知漏洞,并提供修复建议。

# 使用 pipenv 进行安全性检查
pipenv check

5. 项目初始化和模板

一些工具(如 poetryhatch)提供了项目模板和脚手架功能,帮助开发者快速创建新项目。

6. 发布依赖包

一些工具(如 poetry)内置了包发布功能,可以方便地将项目发布到 PyPI(Python Package Index)。

# 使用 poetry 发布包
poetry publish --build

7. 生成依赖配置文件

部分依赖管理工具可以生成描述项目依赖的文件,方便团队协作和部署。例如,pip-tools 可以生成 requirements.txt 文件。

8. 版本管理

这是指如何管理和控制你的项目版本。每次发布新版本时,你需要更新项目的版本号(如从 1.0.0 到 1.1.0),并确保版本号的变化遵循一定的规则(如语义化版本控制)。

版本管理工具可以帮助你自动更新版本号、生成变更日志、创建发布标签等。

二、常见工具及其技术对比

常见 Python 项目及依赖管理工具,包括 PipenvPoetryCondaPip-toolsHatch)和 venv。以下从工具简介、特性介绍、功能对比及流行度三方面进行对比。

1. 工具简介

(1)Pipenv

Pipenv 一度被官方推荐为 Python 项目的依赖管理工具,尤其是在需要自动管理虚拟环境和依赖锁定的场景中。然而,随着时间的推移,它的热度有所下降。

(2)Poetry

Poetry 近年来越来越流行,尤其在需要现代化依赖管理和包发布的项目中。它提供了更好的用户体验和更强大的功能。

(3)Conda

Conda 在数据科学和机器学习领域非常流行,因为它不仅支持 Python,还支持 R 和其他语言,并且其环境管理功能非常强大。

(4)Pip-tools

Pip-tools 在一些需要精确控制依赖版本的项目中很受欢迎,尤其是那些仍然使用 requirements.txt 的项目。

(5)Hatch

Hatch 是一个相对较新的工具,虽然功能强大,但目前还没有达到 PoetryConda 的流行度。

(6)venv

venv 是 Python 标准库中的模块,用于创建轻量级的虚拟环境,方便项目间的依赖隔离。

2. 特性介绍

工具 主要使用场景 主要特性
Pipenv 一般项目,自动管理虚拟环境 自动创建和管理虚拟环境、依赖锁定文件(Pipfile.lock)、友好的 CLI 接口
Poetry 现代化项目,依赖管理和包发布 全面的依赖管理、内置虚拟环境管理、项目构建和发布、依赖解析和锁定
Conda 数据科学和机器学习 跨语言支持、强大的环境管理、包管理、支持多种平台(Windows, macOS, Linux)
Pip-tools 精确控制依赖版本的项目 生成和更新 requirements 文件、依赖锁定、与 pip 兼容
Hatch 现代化项目管理和版本控制 项目模板、环境管理、版本控制、依赖管理、灵活的插件系统
venv 基本虚拟环境管理 Python 内置模块,轻量级虚拟环境管理

3. 功能对比

功能 venv Pipenv Poetry Conda Pip-tools Hatch
创建虚拟环境
自动管理虚拟环境
依赖文件
版本锁定
安全性检查
包发布
依赖冲突解决
项目模板和脚手架
版本管理

4. 流行度

当前(2024 年 7 月 30 日)各工具流行度,如下:

工具 GitHub Stars PyPI 近半年下载量(万) Forks Open Issues Open PRs
Pipenv 24k+ 6466 1862 260 14
Poetry 30k+ 20502 2236 602 74
Conda 6k+ 97 N/A N/A N/A
Pip-tools 7k+ 7254 608 160 27
Hatch 5k+ 1163 285 239 26
venv Python 内置 N/A N/A N/A N/A

三、结论

从上述技术对比来看,无论是功能特性还是流程程度,Poetry 都是当前最适合新 Python 项目的依赖管理工具。不过,部分其他工具也有一定适用场景,如 Pip-tools 适用于有 requirements 的老项目,Conda 适用于多编程语言项目。

四、VS pip

以 poetry 为例,简要介绍上述项目及包依赖管理工具与 pip 的区别。 pip 是一个轻量级的包管理工具,适合简单的包安装和管理任务。 poetry 是一个功能强大的项目管理工具,适合需要全面管理项目依赖和配置的场景。

1. 功能对比

特性 pip poetry
功能和用途 pip 是 Python 的包管理工具,用于安装和管理 Python 包。主要用于从 Python Package Index (PyPI) 下载和安装包,不涉及项目管理。 poetry 是一个全面的 Python 项目管理工具,不仅可以安装和管理包,还可以创建和管理项目、处理依赖关系、发布包等。
配置文件 pip 使用 requirements.txt 文件来列出项目的依赖包。requirements.txt 是一个简单的文本文件,列出所有需要安装的包及其版本。 poetry 使用 pyproject.toml 文件来管理项目的元数据和依赖关系。pyproject.toml 是一个结构化的配置文件,包含项目的详细信息、依赖关系、脚本等。
依赖管理 pip 本身不处理依赖冲突问题,需要开发者手动解决。可以结合 pip-tools 使用,以便更好地管理依赖关系。 poetry 内置依赖解析和锁定机制,可以自动解决依赖冲突问题。会生成一个 poetry.lock 文件,确保项目在不同环境下依赖一致。
虚拟环境管理 pip 本身不管理虚拟环境,但通常与 virtualenvvenv 一起使用。开发者需要手动创建和激活虚拟环境。 poetry 内置虚拟环境管理功能,可以自动创建和管理虚拟环境。使用 poetry 时,虚拟环境的创建和激活是自动处理的。

2. 使用示例

(1)pip

# 安装包
pip install requests # 列出安装的包
pip freeze > requirements.txt # 从 requirements.txt 安装包
pip install -r requirements.txt

(2)poetry

# 创建新项目
poetry new myproject # 进入项目目录
cd myproject # 安装包
poetry add requests # 安装所有依赖
poetry install # 启动虚拟环境
poetry shell

3. 建议

示例项目可用 Python 自带的 pip,简单易用。大型线上生产项目需要做好依赖管理、依赖冲突解决、虚拟环境管理等工作,以保证项目在多种环境下交付一致且稳定运行,poetry 之类的项目及包管理工具更合适的选择。

Python 项目及依赖管理工具技术选型的更多相关文章

  1. Python web 项目的依赖管理工具

    Poetry可以帮助你声明.管理和安装Python项目的依赖项,确保你可以在任何地方都拥有正确的堆栈. Poetry支持Python 2.7 和Python 3以上 安装 Poetry提供了一个自定义 ...

  2. golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的

    golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...

  3. 适合Linux嵌入式项目的代码构建与依赖管理工具——cazel

    前言 我们知道,现在有很多流行的优秀代码构建工具,如CMake.jetkins.bazel等.这些不同的构建工具在其应用的领域起到了举足轻重的作用. 但是,如果仔细研究就会发现,在嵌入式领域,构建工具 ...

  4. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  5. Composer : php依赖管理工具

    原始时代 我记得在当时用php的时候还没有composer,只有个pear,但是不好用呀,还不如直接在互联网上到处复制代码了,更快更不容易出错,当时也没有github这么好的社区工具了 总结如下 代码 ...

  6. Golang依赖管理工具:glide从入门到精通使用

    这是一个创建于 2017-07-22 05:33:09 的文章,其中的信息可能已经有所发展或是发生改变. 介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰 ...

  7. 有用PHP依赖管理工具Composer新手教程

    PHP依赖管理工具Composer新手教程 Composer 是 PHP 的一个依赖管理工具.它同意你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 依赖管理 Composer 不是一个包管理 ...

  8. composer php依赖管理工具

    #composer是什么 Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. composer出现之前我们php项目依赖管理大部分都是手动 ...

  9. supervisor python开发的进程管理工具

    Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...

  10. Go 包依赖管理工具 —— govendor

    govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具.与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本.以及 ...

随机推荐

  1. Java 自定义注解校验字段唯一性

    业务场景 在项目中,某些情景下我们需要验证编码是否重复,账号是否重复,身份证号是否重复等... 那么有没有办法可以解决这类似的重复代码量呢? 我们可以通过自定义注解校验的方式去实现,在实体类上面加上自 ...

  2. 建立Model

    直接使用Sequelize虽然可以,但是存在一些问题. 团队开发时,有人喜欢自己加timestamp: var Pet = sequelize.define('pet', { id: { type: ...

  3. yb课堂 视频详情页模块开发《三十八》

    CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...

  4. 透视开源生态,OSGraph——GitHub全域数据图谱的智能洞察工具

    "透视开源生态,OSGraph--GitHub全域数据图谱的智能洞察工具 OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具,基于GitHub开源数据全域图谱 ...

  5. java后端解决请求跨域

    跨域 跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 例如:a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同 ...

  6. 【nvm、node、npm、nrm】安装配置教程(windows版)

    一.nvm 的安装与配置 1.nvm 下载与安装 nvm官方下载地址 (我这里使用当前最新版本 1.1.12) 2.验证 nvm 是否安装成功 # 查看 nvm 版本 nvm -v # 显示远程可安装 ...

  7. [oeasy]python0078_设置索引颜色_index_color_ansi_控制终端颜色

    更多颜色 回忆上次内容 上次 了解了 高亮颜色 91-97 是 高亮 前景色 101-107是 高亮 背景色 颜色种类 在原来基础上 增加了一些 但也非常有限 还想要 更精细的颜色 有可能吗?? 更多 ...

  8. oeasy教您玩转vim - 44 - # 综合练习

    ​ 综合练习 回忆上节课内容 上次我们学到了各种的替换模式 r,替换当前光标的字符 R,进入替换模式 ~,改变大小写 这次来个综合练习吧! 我们这次要完成这样一个任务 我们有的时候需要写日志 Syst ...

  9. 在Django REST framework (DRF) 中,`request.query_params` 和 `request.data` 区别

    在Django REST framework (DRF) 中,request.query_params 和 request.data 都是用来获取请求中的数据,但是它们之间有一些关键的区别: requ ...

  10. Fiddler篡改请求和响应数据

    Fiddler标记断点后,我们可以通过篡改请求或响应数据,来模拟客户端请求和服务器响应. 一.打断点的方式 1.1 工具栏设置断点 工具栏勾选断点类型进行断点,路径:Rules->Automat ...