建立在Python包括模块和功能调用图?(Build a Call graph in python

2019-07-17 11:13发布

我有一大堆的脚本来执行任务。 我真的需要知道该项目的调用图,因为它是非常混乱。 我不能,因为它需要额外的硬件和软件这样做执行代码。 不过,我需要了解它背后的逻辑。 所以,我需要知道,如果有一个工具(不需要任何Python文件执行),可以建立一个使用的模块,而不是跟踪或Python语法分析器调用图。 我有这样的工具,C,但不是蟒蛇。
谢谢。

Answer 1:

我发现最好的工具被称为pyan ,并且最初写由埃德蒙·霍纳 , 他所改善 ,再给予彩色的和其他功能尤哈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.py --dot -c -e pyan.py | fdp -Tpng

埃德蒙·霍纳的原代码,现在最好的就是找到他的github仓库 ,有人也取得了存储库两个版本 ,在那里你可以下载尤哈Jeronen的版本 。 我做了一个干净的版本结合他们的捐款变成我自己的仓库只为雄精灵 ,因为这两个库有很多其他的软件。



Answer 2:

你可能想看看pycallgraph:

pycallgraph

此外,在该链路中的多个手动方法被描述:

产生的呼叫图换理解和-重构的Python代码



Answer 3:

总之,没有这样的工具存在。 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_obj以及使用getattr调用它的方法之一。 这是两种方法,将使得很难创造蟒蛇静态调用图。 此外,还有各种难以分析导入模块的方式。

我觉得你最好的选择将是坐下来与代码库和纸垫,并开始用手做笔记。 这将有可能使你更熟悉的代码库的双重好处,并且不会受到难以解析的情况很容易受骗。



Answer 4:

没有这样的工具存在任何语言的任何程序。 创建这样的工具就相当于解决停机问题,这是不可判定。 简单地说,给定一个任意的程序和它的输入没有算法来确定节目是否将停止或永远运行。 同样,没有算法,可以判断函数x是否会调用函数y,或某行代码是否会执行,等等。显然,某些程序可确定这些行为。 例如,用打印语句将平凡执行一行,并出口1行程序。 但任意程序可以是任意复杂的,所以它可以证明没有存在的算法来确定任意节目的这些行为。 不幸的是,你需要能够运行程序来解决这个问题。



文章来源: Build a Call graph in python including modules and functions?