跳转到主要内容

显示模块依赖关系

项目描述

Documentation Status 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 Downloads

Python模块依赖可视化。

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

功能请求和错误报告

请在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]
              [--find-package] [-v] [-o file] [-T FORMAT] [--display PROGRAM]
              [--noshow] [--show-deps] [--show-raw-deps] [--deps-output DEPS_OUT]
              [--show-dot] [--dot-output DOT_OUT] [--nodot] [--no-output]
              [--show-cycles] [--debug-mf INT] [--noise-level INT]
              [--max-bacon INT] [--max-module-depth 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 ...]] [--start-color INT]
              fname
位置参数

fname 文件名

可选参数
-h--help

显示此帮助信息并退出

--debug

开启所有显示和详细选项(主要用于调试pydeps本身)

--config FILE

指定配置文件

--no-config

禁用配置文件的处理

--version

打印pydeps版本

-L LOG--log LOG

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

--find-package

尝试自动找到当前包的名称。

-v, --verbose

更详细地显示 (-vv, -vvv 表示更详细的输出)

-o 文件

将输出写入“文件”

-T 格式

输出格式(svg|png)

--display 程序

用于显示图表的程序(根据 T 参数决定是 png 或 svg 文件)

--noshow, --no-show

不调用外部程序显示图表

--show-deps

显示依赖分析的输出

--show-raw-deps

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

--deps-output

将依赖分析的输出写入文件(而不是屏幕)

--show-dot

显示 dot 转换的输出

--dot-output

将 dot 代码写入文件(而不是屏幕)

--nodot, --no-dot

跳过 dot 转换

--no-output

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

--show-cycles

仅显示导入循环

--debug-mf INT

将 ModuleFinder.debug 标志设置为此值

--noise-level INT

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

--max-bacon INT

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

--max-module-depth INT

合并深度模块到最多 n 级

--pylib

包含 python std lib 模块

--pylib-all

包含 python 所有 std lib 模块(包括 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 模式, --exclude 模式

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

--exclude-exact MODULE

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

注意:如果提供了具有可变数量参数的选项(如 -x),则在 fname 之前提供该选项,使用 -- 将参数与文件名分开,否则 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字节码中的导入操作码来查找导入。也就是说,只有导入的文件会被找到(即,pydeps不会检查目录中未被导入的文件)。此外,只有可以使用Python导入机制找到的文件才会被考虑(即,如果某个模块缺失或未安装,无论是否正在导入,都不会包括在内)。这可以通过使用--include-missing标志来修改。

显示图表

默认情况下,要显示生成的.svg.png文件,pydeps会调用平台上的适当打开器,例如xdg-open foo.svg

可以使用--display PROGRAM选项来覆盖此行为,其中PROGRAM是能够显示图表图像文件的可执行程序。

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

配置文件

所有选项也可以使用.pydeps文件中的.ini文件语法(由ConfigParser解析)来设置。命令行选项会覆盖当前目录中的.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还会在pyproject.toml(在[tool.pydeps]下)和setup.cfg(在[pydeps]下)中查找配置数据。

培根(评分)

pydeps还包含一个类似Erdős的评分函数(也称为Bacon数,来自《六度分隔》中的凯文·贝肯(《六度分隔》:http://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon)),允许您过滤出距离您感兴趣的模块超过给定“跳数”的模块。这对于找到模块与外部世界接口很有用。

要找到pydeps与Python标准库的接口(除了少数非常常见的模块)。

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参数检测并显示循环。这将仅显示循环,对于大型库来说,这不是一个特别快的操作。给定以下内容的文件夹(此使用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. stdlib_list.
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pydeps-rmprefix.svg?sanitize=true

最大模块深度

对于具有超过两层模块结构的 Python 包,图形可能会变得过于复杂。使用 --max-module-depth=n 标志来检查包的内部依赖关系,同时限制模块深度(移除私有和测试相关的模块以进一步简化图形,使用 -x ...

shell> pydeps pandas --only pandas --max-module-depth=2 -x pandas._* pandas.test* pandas.conftest
https://raw.githubusercontent.com/thebjorn/pydeps/master/docs/_static/pandas-max-module-depth.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.12.19 感谢 wiguwbe 提供的 PR,修复了与 --no-dot 标志的不一致。

版本 1.12.13 更好的文档针对大型包。有关示例,请参阅 maximum_module_depth。感谢 sheromon 提供的 PR。

版本 1.12.5 Pydeps 现在可以从 pyproject.toml 读取配置数据。感谢 septatrix 提出这个想法,并以信息丰富的论点反驳了我的 toml-rant。

版本 1.11.0 删除了对 Python 3.6 的支持。感谢 pawamoy 移除了已弃用的 imp 模块的导入。(由于 Python 的一个错误,部分代码已被供应商化,请参阅代码以获取详细信息。)

版本 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 当放置在 .pydeps 文件中时,现在会尊重 no_show。感谢 romain-dartigues 提供的 PR。

版本 1.9.8 修复了使用大型框架(如 sympy)时超过最大递归深度的错误。感谢 tanujkhattar 发现修复并感谢 balopat 报告此问题。

版本 1.9.7 检查 PYDEPS_DISPLAYBROWSER 以打开图形,由 jhermann 提供的 PR。

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

版本 1.9.0 支持 Python 3.8。

版本 1.8.7 包含了一个新的标志 --rmprefix,允许您从图中节点的标签中移除前缀。节点的 _名称_ 不会受到影响,因此这不会导致节点合并,也不会改变颜色 - 但可能导致多个节点具有相同的标签(悬停在节点上会显示完整名称)。感谢 aroberge 对增强请求的贡献。

版本 1.8.5 当以 svg 作为输出格式(默认格式)时,鼠标悬停时会突出显示路径(感谢 tomasito665 对增强请求的贡献)。

版本 1.8.2 包含一个新的标志 --only,使得 pydeps 只报告指定的路径

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

版本 1.8.0 包含了用于绘制外部依赖项作为簇的 4 个新标志。有关示例,请参阅 clustering。此外,箭头现在具有源节点的颜色。

版本 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 标志反转了依赖图中的箭头方向,使它们指向导入的模块而不是从导入的模块指向(感谢 goetzk 对错误报告和 tobiasmaier 对 PR 的贡献)!

版本 1.5.0 支持 Python 3(感谢 eight04 对 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. 创建新的 Pull Request

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pydeps-1.12.20.tar.gz (51.1 kB 查看哈希值)

上传时间 源代码

构建分发

pydeps-1.12.20-py3-none-any.whl (46.2 kB 查看哈希值)

上传时间 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面