Skip to main content

显示模块依赖项

项目描述

文件状态 https://github.com/thebjorn/pydeps/actions/workflows/ci-cd.yml/badge.svg https://codecov.io/gh/thebjorn/pydeps/branch/master/graph/badge.svg?token=VsYwrSFcJa 下载

Python 模块依赖可视化。

该软件包主要用于通过 pydeps命令从命令行使用。

<nav class="contents" id="contents" role="doc-toc">

内容

</nav>

功能请求和错误报告:

请在 GitHub 上报告错误和功能请求, 网址为https://github.com/thebjorn/pydeps/issues

如何安装

pip install pydeps

要使用pydeps创建图形,您还需要安装Graphviz。请按照 Graphviz 链接中提供的安装说明进行操作(并确保dot命令位于您的路径中)。

用法

usage: pydeps [-h] [--debug] [--config FILE] [--no-config] [--version]
              [-L LOG] [-v] [-o file] [-T FORMAT] [--display PROGRAM]
              [--noshow] [--show-deps] [--show-raw-deps] [--show-dot]
              [--nodot] [--no-output] [--show-cycles] [--debug-mf INT]
              [--noise-level INT] [--max-bacon INT] [--pylib] [--pylib-all]
              [--include-missing] [-x PATTERN [PATTERN ...]]
              [-xx MODULE [MODULE ...]] [--only MODULE_PATH [MODULE_PATH ...]]
              [--externals] [--reverse] [--rankdir {TB,BT,LR,RL}] [--cluster]
              [--min-cluster-size INT] [--max-cluster-size INT]
              [--keep-target-cluster] [--collapse-target-cluster]
              [--rmprefix PREFIX [PREFIX ...]]
              fname
位置参数:

fname 文件名

可选参数:
-h, --help

显示此帮助信息并退出

--config FILE

指定配置文件

--no-config

禁用配置文件的处理

--version

打印 pydeps 版本

-L LOG, --log LOG

将日志级别设置为 CRITICAL、ERROR、WARNING、INFO、DEBUG、NOTSET 之一。

-v, --verbose

更详细(-vv,-vvv 更详细)

-o file

将输出写入“文件”

-T FORMAT

输出格式 (svg|png)

--display PROGRAM

用于显示图形的程序(png 或 svg 文件,取决于 T 参数)

--noshow

不要调用外部程序来显示图形

--show-deps

显示依赖分析的输出

--show-raw-deps

在删除跳过之前显示依赖分析的输出

--show-dot

显示点转换的输出

--nodot

跳过点转换

--no-output

不要创建 .svg/.png 文件,意味着 –no-show(-t/-o 将被忽略)

--show-cycles

仅显示导入周期

--debug

打开所有 show 和 verbose 选项(主要用于调试 pydeps 本身)

--noise-level INT

排除度数大于噪声级的源或汇

--max-bacon INT

排除超过 n 跳的节点(默认 = 2, 0 -> 无限)

--pylib

包括 python 标准库模块

--pylib-all

包括 python 所有标准库模块(包括 C 模块)

--include-missing

包括未安装的模块(或在 sys.path 上找不到)

--only MODULE_PATH

只包含以 MODULE_PATH 开头的模块,可以提供多个路径

--externals

创建直接外部依赖项列表

--reverse

向(而不是从)导入的模块绘制箭头

--rankdir

设置图形的方向,合法值为 TB(默认,导入模块在导入模块之上)、BT(与 TB 方向相反)、LR(从左到右)和 RL(从右到左)

--cluster

将外部依赖项绘制为单独的集群

--min-cluster-size INT

在集群之前依赖项必须具有的最小节点数(默认值 = 0)

--max-cluster-size INT

在集群折叠到单个节点之前依赖项可以拥有的最大节点数(默认值 = 0)

--keep-target-cluster

将目标模块绘制为集群

--collapse-target-cluster

折叠目标模块(这意味着–cluster)

--rmprefix PREFIX

从显示的节点名称中删除 PREFIX(可以提供多个前缀)

-x PATTERN, --exclude PATTERN

要跳过的输入文件(例如foo.*),可以提供多种模式

--exclude-exact MODULE

(简写 -xx MODULE)与 –exclude 相同,但需要完全匹配。-xx foo.bar将排除 foo.bar,但不排除 foo.bar.blob

注意:如果在fname之前提供了具有可变数量参数的选项(如-x),则使用--将参数与文件名分开,否则fname 将被解析为选项的参数。示例:$ pydeps -x os sys -- pydeps

当然,您也可以从 Python 导入pydeps并将其用作库,在 tests/test_relative_imports.py中查看示例。

例子

这是在自身上运行pydeps的结果(pydeps pydeps):

https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps.svg?sanitize=true

(完全披露:这是 pydeps 的早期版本)

笔记

pydeps 通过在 python 字节码(想想.pyc文件)中查找 import-opcodes 来查找导入。因此,只会找到导入的文件(即 pydeps 不会查看您目录中未导入的文件)。此外,仅会考虑使用 Python 导入机制可以找到的文件(即,如果模块丢失或未安装,则无论是否导入它都不会包含在内)。这可以通过使用--include-missing 标志来修改。

显示图表:

为了显示生成的.svg.png文件,pydeps默认为平台调用适当的打开器,例如xdg-open foo.svg

这可以用--display PROGRAM选项覆盖,其中PROGRAM是一个可执行文件,可以显示图形的图像文件。

您还可以在PYDEPS_DISPLAYBROWSER环境变量中导出此类查看器的名称,这会在不使用--display时更改默认行为。

.pydeps

所有选项也可以使用.ini文件语法(可由ConfigParser解析)在.pydeps文件中设置。命令行选项覆盖当前目录中.pydeps文件中的选项,这再次覆盖用户主目录中的选项(Windows 上为%USERPROFILE%\.pydeps ,否则为 ${HOME}/.pydeps )。

一个示例 .pydeps 文件:

[pydeps]
max_bacon = 2
no_show = True
verbose = 0
pylib = False
exclude =
    os
    re
    sys
    collections
    __future__

培根(评分)

pydeps还包含一个类似 Erdős 的评分函数(又名培根数,来自 Kevin Bacon 的六度(http://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon),可让您过滤掉超过给定数量的模块 '跳离您感兴趣的模块。这对于查找模块与世界其他地方的接口很有用。

找到 pydeps 到 Python stdlib 的接口(少一些非常常见的模块)。

shell> pydeps pydeps --show --max-bacon 2 --pylib -x os re types _* enum
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-pylib.svg?sanitize=true

--max-bacon 2(默认值)给出最多 2 跳的模块,并且属于一起的模块具有相似的颜色。将其与--max-bacon=0(无限)过滤器的输出进行比较:

https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-pylib-all.svg?sanitize=true

导入周期

pydeps可以使用 --show-cycles 参数检测和显示周期。这将 _only_ 显示循环,对于大型库来说,这不是一个特别快的操作。给定一个包含以下内容的文件夹(这使用 yaml 来定义目录结构,就像在测试中一样):

relimp:
    - __init__.py
    - a.py: |
        from . import b
    - b.py: |
        from . import a

pydeps relimp --show-cycles显示:

https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-cycle.svg?sanitize=true

集群外部

在 pydeps 1.8.0 版本上运行pydeps pydeps –max-bacon=4会得到下图:

https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4.svg?sanitize=true

如果您对外部模块的内部结构不感兴趣,可以添加--cluster标志,它将外部模块折叠成文件夹形状的对象:

shell> pydeps pydeps --max-bacon=4 --cluster
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4-cluster.svg?sanitize=true

要查看内部结构_并_描述外部模块,请使用--max-cluster-size标志,该标志控制集群中可以有多少节点,然后将其折叠为文件夹图标:

shell> pydeps pydeps --max-bacon=4 --cluster --max-cluster-size=1000
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4-cluster-max1000.svg?sanitize=true

或者,使用较小的最大集群大小:

shell> pydeps pydeps --max-bacon=4 --cluster --max-cluster-size=3
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4-cluster-max3.svg?sanitize=true

要删除节点太少的集群,请使用--min-cluster-size标志:

shell> pydeps pydeps --max-bacon=4 --cluster --max-cluster-size=3 --min-cluster-size=2
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4-cluster-max3-min2.svg?sanitize=true

在某些情况下,将目标模块绘制为集群会很有用:

shell> pydeps pydeps --max-bacon=4 --cluster --max-cluster-size=3 --min-cluster-size=2 --keep-target-cluster
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-18-bacon4-cluster-max3-min2-keep-target.svg?sanitize=true

..并且由于集群框包含模块名称,我们可以删除这些前缀:

shell> pydeps pydeps --max-bacon=4 --cluster --max-cluster-size=3 --min-cluster-size=2 --keep-target-cluster --rmprefix pydeps。标准库列表。
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rmprefix.svg?sanitize=true

图形方向

可以使用--rankdir标志指定图形的方向。

从上到下(默认):

shell> pydeps pydeps --rankdir TB
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rankdir-tb.svg?sanitize=true

从下到上:

shell> pydeps pydeps --rankdir BT
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rankdir-bt.svg?sanitize=true

左到右:

shell> pydeps pydeps --rankdir LR
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rankdir-lr.svg?sanitize=true

右到左:

shell> pydeps pydeps --rankdir RL
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rankdir-rl.svg?sanitize=true

折叠目标包

当内部目标包依赖项不重要时,可以使用--collapse-target-cluster标志折叠它们。此选项还意味着--cluster

shell> pydeps pydeps --collapse-target-cluster
https://raw.githubusercontent.com/mlga/pydeps/collapse-target/docs/_static/pydeps-collapse-target-cluster.svg?sanitize=true

中间格式

已尝试保持中间格式可读,例如。pydeps --show-deps ..的输出如下所示:

...
"pydeps.mf27": {
    "imported_by": [
        "__main__",
        "pydeps.py2depgraph"
    ],
    "kind": "imp.PY_SOURCE",
    "name": "pydeps.mf27",
    "path": "pydeps\\mf27.py"
},
"pydeps.py2depgraph": {
    "imported_by": [
        "__main__",
        "pydeps.pydeps"
    ],
    "imports": [
        "pydeps.depgraph",
        "pydeps.mf27"
    ],
    "kind": "imp.PY_SOURCE",
    "name": "pydeps.py2depgraph",
    "path": "pydeps\\py2depgraph.py"
}, ...

版本历史

版本 1.10.1感谢vector400提供了一个新选项--rankdir,它可以在不同方向呈现图形。

版本 1.10.0支持 Python 3.10。

版本 1.9.15感谢Pipeline Foundation大大改进了 CI 流水线以及 CD 流水线。

版本 1.9.14感谢poneill修复了在没有__init__.py文件的目录中运行时出现的神秘错误消息。

版本 1.9.13感谢glumiaSimonBiggs改进文档。

版本 1.9.10 no_show现在放在.pydeps文件中时会受到尊重。感谢romain-dartigues的 PR。

版本 1.9.8修复了使用大型框架(如sympy)时超出的最大递归深度。感谢tanujkhattar找到修复程序并 感谢balopat报告它。

版本 1.9.7检查PYDEPS_DISPLAYBROWSER以获取打开图形的程序,PR by jhermann

版本 1.9.1的图表现在在 Python 3.x 上也很稳定 - Py2.7 已经是这种情况(感谢pawamoy报告和测试问题以及kinow帮助测试)。

1.9.0 版支持 Python 3.8。

版本 1.8.7包括一个新标志--rmprefix,它允许您从图中的节点标签中删除前缀。节点的 _name_ 不受影响,因此这不会导致节点合并,也不会改变颜色 - 但它可能导致多个节点具有相同的标签(将鼠标悬停在节点上将给出全名)。感谢 aroberge的增强请求。

版本 1.8.5使用 svg 作为输出格式(这是默认格式),现在在鼠标悬停时会突出显示路径(感谢tomasito665的增强请求)。

版本 1.8.2包含一个新标志--only,它导致 pydeps 仅报告指定的路径:

shell> pydeps mypackage --only mypackage.a mypackage.b

1.8.0 版包括 4 个新标志,用于将外部依赖项绘制为集群。有关示例,请参见clustering-externals。此外,箭头现在具有源节点的颜色。

版本 1.7.3包括一个新标志-xx--exclude-exact ,它与--exclude标志的功能相匹配,但它需要完全匹配,即-xx foo.bar将排除 foo.bar,但不排除 foo。 bar.blob(感谢AvenzaOleg的 PR)。

1.7.2 版包含一个新标志--no-output,它可以防止创建 .svg/.png 文件。

版本 1.7.1修复了 .pydeps 文件中的排除项(感谢eqvis 的错误报告)。

版本 1.7.0新的--reverse标志反转了依赖图中箭头的方向,因此它们指向 _to_ 导入的模块而不是 _from_ 导入的模块(感谢goetzk的错误报告和tobiasmaier的 PR!)。

版本 1.5.0 Python 3 支持(感谢804的 PR)。

版本 1.3.4 --externals现在将包括尚未安装的模块(modulefinder称为badmodules)。

版本 1.2.8添加了用于查找包的直接外部依赖项的快捷方式:

pydeps --externals mypackage

它将在屏幕上打印一个 json 格式的模块名称列表,例如:

(dev) go|c:\srv\lib\dk-tasklib> pydeps --externals dktasklib
[
    "dkfileutils"
]

这意味着dktasklib包只依赖于dkfileutils 包。

此功能也可以通过编程方式使用:

import os
from pydeps.pydeps import externals
# the directory that contains setup.py (one level up from actual package):
os.chdir('package-directory')
print externals('mypackage')

版本 1.2.5:默认值现在是明智的,例如:

shell> pydeps mypackage

可能会做你想做的事。它与 pydeps --show --max-bacon=2 mypackage相同,这意味着在浏览器中显示依赖关系图,但将其限制为两跳(仅包括模块导入的模块 - 不继续导入链)。旧的默认行为可通过 pydeps --noshow --max-bacon=0 mypackage获得。

贡献

  1. 叉它

  2. 如果您首先提出问题,我们将不胜感激(但不是必需的):https ://github.com/thebjorn/pydeps/issues

  3. 创建您的功能分支(git checkout -b my-new-feature

  4. 提交您的更改(git commit -am 'Add some feature'

  5. 推送到分支(git push origin my-new-feature

  6. 创建新的拉取请求

项目详情