如何使用 pigar 自动生成 Python 项目的 requirements.txt

文章目录

在 Python 项目的开发过程中,管理依赖项是一项非常重要的工作,尤其是在项目逐渐庞大时。requirements.txt 文件作为 Python 项目的依赖列表文件,帮助开发者快速重现项目环境。然而,手动维护这个文件可能会耗费大量时间,并且容易出错。为了简化这个过程,我们可以使用 pigar 这款工具,它能自动生成 requirements.txt 文件,并且还能处理各种复杂情况。

pigar 是什么?

pigar 是一个专为生成 Python 项目依赖文件 requirements.txt 而设计的工具。它可以自动解析项目中的导入语句,生成一个完整的依赖列表。同时,pigar 还支持 Jupyter notebook (*.ipynb),并能够处理通过 execevalimportlib 方式导入的模块。此外,pigar 还能检测不同 Python 版本之间的差异,并提供一些实验性功能来提高依赖管理的便利性。

需要注意的是,pigar 不是一个依赖管理工具,它更像是一个辅助工具,帮助你为已有项目生成 requirements.txt 文件,从而更容易迁移到新的开发环境。

同类型工具还有 pipreqs,相关阅读:

安装 pigar

pigar 支持 Python 3.7 及以上版本。你可以通过 pipconda 来安装:

使用 pip 安装:

[sudo] pip install pigar

使用 conda 安装:

conda install -c conda-forge pigar

如果你想获取 GitHub 上的最新代码,可以使用以下命令:

pip install git+https://github.com/damnever/pigar.git@[main or other branch] --upgrade

pigar 的使用方法

生成 requirements.txt

pigar 的主要功能是生成 requirements.txt 文件,它能处理大部分复杂的情况。例如,你可以通过以下命令生成当前目录下的 requirements.txt 文件:

pigar generate

如果你需要为指定目录生成 requirements.txt 文件,并指定输出文件名,可以这样做:

pigar gen -f ../dev-requirements.txt ../

此外,pigar gen --with-referenced-comments 还可以列出引用了每个包的文件及行号(对于 Jupyter notebook,行号可能有些混乱):

# project/foo.py: 2,3
# project/bar/baz.py: 2,7,8,9
foobar == 3.3.3

requirements.txt 文件被覆盖的情况下,pigar 会显示旧文件和新文件之间的差异。你可以使用 --dont-show-differences 参数来禁用此功能。

需要注意的是,pigar 会首先在本地环境中搜索包,然后进行进一步分析并在 PyPI 上搜索缺失的包。

搜索包的分发名称

在某些情况下,你可能会遇到导入错误(Import Error),但不确定该导入名属于哪个分发包。例如,bs4 可能来自 beautifulsoup4MySQLdb 可能来自 mysql-python。在这种情况下,你可以使用 pigar 来搜索:

pigar search bs4 MySQLdb

检查依赖的最新版本

你可以使用 pigar 来检查项目依赖的最新版本:

# 指定 requirements 文件
pigar check -f ./requirements.txt

# 或者让 pigar 自动搜索当前目录下的所有 *requirements.txt 文件
pigar check

更多功能

pigar 提供了多种命令和参数,帮助开发者更加灵活地管理依赖。你可以使用 --help 查看所有支持的命令和选项:

pigar --help

实验性功能

requirement-annotations

某些包可能需要根据你的使用情况安装可选的依赖项。为了让 pigar 更加实用,你可以使用 pigar generate --enable-feature requirement-annotations 来生成带有注释的依赖文件:

import foo # pigar: required-imports=import_name_bar,import_name_baz
import foo # pigar: required-packages=package-name-bar,package-name-baz # 允许额外注释
foo(features=['bar', 'baz']) # pigar: required-distributions=package-name-bar,package-name-baz

如果你不希望在代码中加入注释,可以将这些注释提取到一个单独的 Python 文件中,例如 pigar_annotations.py,然后在需要时删除它。

常见问题解答

pigar 是一个依赖管理工具吗?

不是。 虽然 pigar 能够帮助生成依赖文件,但它并不是一个完整的依赖管理工具。如果你需要更强大的依赖管理功能,建议使用 Pipenv 或其他工具 来改进你的开发流程。

为什么 pigar 会为相同的导入名显示多个包?

pigar 可能无法优雅地处理这种情况,你可能需要手动移除 requirements.txt 中的重复包,或者在 pigar 提问时选择其中一个。确保在本地环境中安装所需的包也能解决这个问题。

为什么 pigar 无法找到未显式导入的包?

一些框架可能会使用某种“魔法”自动为用户导入模块,而 pigar 无法处理这种情况。你可能需要手动修复它,或者使用 实验性功能 来解决。

总结

pigar 是一个非常实用的工具,能自动生成 Python 项目的 requirements.txt 文件,并处理各种复杂情况。如果你正在维护一个庞大的 Python 项目,pigar 将为你节省大量时间,并且减少出错的机会。不妨试试看,让你的开发流程更加顺畅!


也可以看看