#poetry #unused #python #toml #find #dependencies #pyproject

bin+lib poetry-udeps

在 pyproject.toml 中查找未使用的依赖项

11 个版本

0.2.3 2024年3月6日
0.2.2 2024年1月21日
0.1.6 2024年1月18日
0.1.3 2023年8月8日

#389命令行工具

Download history 4/week @ 2024-05-20 1/week @ 2024-06-03 3/week @ 2024-06-10

419 每月下载量

BlueOak-1.0.0

31KB
535

🪚
poetry-udeps

在 pyproject.toml 中查找未使用的依赖项。


poetry-udepscargo-udeps 的启发,是一个用于在基于 Poetry 的 Python 项目中查找未使用依赖项的工具。也就是说,在 pyproject.toml 中查找未使用依赖项。

Python 依赖项并不总是与其包名一一对应。因此,您可能会看到一些假阳性。希望这个工具生成的假阳性列表足够小,以至于它可以发挥作用,并且易于手动审计。

可以将额外的名称映射添加到 src/name_map.rs 中以提高准确性。

内容

安装

此工具假设您在具有 poetry 的位置运行它,该位置在您的 $PATH 上。

来自 crates.io

cargo install poetry-udeps --locked

使用方法

这应该在您的 Poetry 项目根目录中运行。

Find unused dependencies in pyproject.toml

Usage: poetry-udeps [OPTIONS]

Options:
  -v, --verbose...  More output per occurrence
  -q, --quiet...    Less output per occurrence
  -e, --virtualenv  Whether to look for dependency usage in the poetry
                    virtualenv
  -d, --dev         Whether to look for unused dependencies from
                    dev-dependencies
  -h, --help        Print help (see more with '--help')
  -V, --version     Print version

它是如何工作的?

这是一个非常简单的解析方法。也就是说,poetry-udeps 不解释任何 Python,我们只是逐字搜索项目中的所有文件以查找与包名(或由嵌入式名称映射定义的别名)匹配的导入语句。这意味着它非常快!但是,这也意味着它无法检测到一些假阳性。例如,sqlalchemy 的异步会话可能依赖于 asyncpg,即使您的项目立即不导入它。为了帮助解决(某种程度上)这个问题,您可以使用选项(--virtualenv)来包括搜索您 poetry 环境中的所有 Python 文件。

  • deptry(Python):在 Python 项目中查找未使用、缺失和传递依赖项。
  • pip-extra-reqs(Python):查找应包含在项目要求中的包。
  • fawltydeps(Python):Python 依赖项检查器。
  • py-unused-deps (python): 在您的Python包中查找未使用的依赖项。

基准测试

poetry-udeps 仅检查未使用的依赖项。以下,我们在AMD Ryzen 7 3700X和16 GB RAM的台式机上对此单个功能进行了基准测试。目标仓库是一个包含约10万行Python代码的私有仓库。

❯ tokei -C -t Python
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 Python                699       118239       100522         5464        12253
===============================================================================
 Total                 699       118239       100522         5464        12253
===============================================================================

结果

poetry-udeps
❯ hyperfine --warmup 2 'poetry-udeps'
Benchmark 1: poetry-udeps
  Time (mean ± σ):     116.2 ms ±   2.9 ms    [User: 217.9 ms, System: 12.9 ms]
  Range (min … max):   111.6 ms … 123.5 ms    26 runs
deptry

对于 deptry,只考虑了 DEP002(未使用的依赖项)。

❯ hyperfine --warmup 2 -i 'deptry -i DEP001,DEP003,DEP004 .'
Benchmark 1: deptry -i DEP001,DEP003,DEP004 .
  Time (mean ± σ):      1.065 s ±  0.020 s    [User: 1.038 s, System: 0.026 s]
  Range (min … max):    1.043 s …  1.116 s    10 runs
pip-extra-reqs

pip-extra-reqs 无法在此项目上运行。

❯ pip-extra-reqs .
Traceback (most recent call last):
  File "/home/benchmark/.venv/bin/pip-extra-reqs", line 8, in <module>
    sys.exit(main())
  File "/home/benchmark/.venv/lib/python3.10/site-packages/pip_check_reqs/find_extra_reqs.py", line 211, in main
    extras = find_extra_reqs(
  File "/home/benchmark/.venv/lib/python3.10/site-packages/pip_check_reqs/find_extra_reqs.py", line 35, in find_extra_reqs
    used_modules = common.find_imported_modules(
  File "/home/benchmark/.venv/lib/python3.10/site-packages/pip_check_reqs/common.py", line 153, in find_imported_modules
    vis.visit(ast.parse(content, str(filename)))
  File "/home/lukehsiao/.pyenv/versions/3.10.5/lib/python3.10/ast.py", line 50, in parse
    return compile(source, filename, mode, flags,
  File "/home/benchmark/.venv/lib/python3.10/site-packages/uuid.py", line 138
    if not 0 <= time_low < 1<<32L:
                               ^
SyntaxError: invalid decimal literal
fawltydeps
❯ hyperfine --warmup 2 -i 'fawltydeps --check-unused --deps pyproject.toml'
Benchmark 1: fawltydeps --check-unused --deps pyproject.toml
  Time (mean ± σ):      3.824 s ±  0.043 s    [User: 3.628 s, System: 0.196 s]
  Range (min … max):    3.793 s …  3.916 s    10 runs
py-unused-deps

我无法在此项目上成功运行 py-unused-deps

成就墙

这是一个使用 poetry-udeps 找到未使用依赖项的案例列表。欢迎您扩展它

  • 待办事项

许可

此工具在蓝橡树许可协议下分发。任何贡献都根据相同的许可证许可,并通过 开发者证书起源 予以承认。

有关详细信息,请参阅 LICENSE

依赖关系

~11–24MB
~295K SLoC