72

我有一堆脚本来执行任务。而且我真的需要知道项目的调用图,因为它非常令人困惑。我无法执行代码,因为它需要额外的硬件和软件来执行此操作。但是,我需要了解其背后的逻辑。所以,我需要知道是否有一个工具(不需要任何 python 文件执行)可以使用模块而不是跟踪或 python 解析器来构建调用图。我有用于 C 的此类工具,但没有用于 python 的工具。
谢谢你。

4

8 回答 8

50

我发现的最好的工具叫做pyan最初Edmund Horner编写,由他改进,然后由Juha Jeronen赋予着色和其他功能。该版本具有有用的命令行选项:

Usage: pyan.py FILENAME... [--dot|--tgf]

Analyse one or more Python source files and generate an approximate call graph
of the modules, classes and functions within them.

Options:
  -h, --help           show this help message and exit
  --dot                output in GraphViz dot format
  --tgf                output in Trivial Graph Format
  -v, --verbose        verbose output
  -d, --defines        add edges for 'defines' relationships [default]
  -n, --no-defines     do not add edges for 'defines' relationships
  -u, --uses           add edges for 'uses' relationships [default]
  -N, --no-uses        do not add edges for 'uses' relationships
  -c, --colored        color nodes according to namespace [dot only]
  -g, --grouped        group nodes (create subgraphs) according to namespace
                       [dot only]
  -e, --nested-groups  create nested groups (subgraphs) for nested namespaces
                       (implies -g) [dot only]

这是运行的结果pyan.py --dot -c -e pyan.py | fdp -Tpng

pyan 自身的输出

Edmund Horner 的原始代码现在最好在他的 github 存储库中找到,并且有人还创建了一个包含两个版本的存储库,您可以从中下载 Juha Jeronen 的版本。我已经制作了一个干净的版本,将他们的贡献结合到我自己的存储库中,只是为了 pyan,因为两个存储库都有很多其他软件。

于 2016-01-20T16:43:38.197 回答
32

您可能想查看 pycallgraph:

pycallgraph

同样在此链接中描述了一种更手动的方法:

生成调用图用于理解和重构 python 代码

于 2012-12-20T00:32:08.957 回答
5

简而言之,不存在这样的工具。Python 是一种过于动态的语言,无法在不执行代码的情况下生成调用图。

下面是一些代码,它清楚地展示了 python 的一些非常动态的特性:

class my_obj(object):
    def __init__(self, item):
        self.item = item
    def item_to_power(self, power):
        return self.item ** power

def strange_power_call(obj):
    to_call = "item_to_power"
    return getattr(obj, to_call)(4)

a = eval("my" + "_obj" + "(12)")
b = strange_power_call(a)

请注意,我们eval用于创建一个实例,my_objgetattr用于调用其方法之一。这两种方法都使得为 python 创建静态调用图变得极其困难。此外,还有各种难以分析的导入模块的方式。

我认为你最好的选择是坐下来拿着代码库和一张纸,开始手写笔记。这将具有让您更熟悉代码库的双重好处,并且不会轻易被难以解析的场景所欺骗。

于 2012-12-20T00:24:39.430 回答
4

SourceTrail 将在这里为您提供帮助。https://www.sourcetrail.com/

Sourcetrail 是一个免费的开源跨平台源代码浏览器,可帮助您在不熟悉的源代码上高效工作。支持 C、C++、Java 和 Python

https://github.com/CoatiSoftware/Sourcetrail

在此处输入图像描述

这是文档的链接

https://www.sourcetrail.com/documentation/

请注意,Python 支持相对较新,因此请不要期望它能够完美运行。

于 2020-01-08T08:10:43.027 回答
2

您应该查看PyCG,这是我们创建的经过同行评审的Python 调用图生成器,它可以处理 Python 的大部分功能,包括高阶函数、类、生成器等。

于 2021-01-03T15:09:26.780 回答
1

我最近(2021 年)在寻找这样的工具,发现似乎在积极维护的code2flow 。

于 2021-08-13T21:04:12.783 回答
1

我找到的 pyan3 的工作版本是 1.1.1 ( pip install pyan3==1.1.1),它的文档在这里

于 2021-08-12T05:26:53.307 回答
0

我还在:https ://github.com/zw-normal/pycallgraph 写了一个小工具。代码的概念很容易理解和使用,但它只提供有限的信息,还需要另一个 IDE 才能更好地理解。

于 2020-10-04T21:17:11.053 回答