我有一堆脚本来执行任务。而且我真的需要知道项目的调用图,因为它非常令人困惑。我无法执行代码,因为它需要额外的硬件和软件来执行此操作。但是,我需要了解其背后的逻辑。所以,我需要知道是否有一个工具(不需要任何 python 文件执行)可以使用模块而不是跟踪或 python 解析器来构建调用图。我有用于 C 的此类工具,但没有用于 python 的工具。
谢谢你。
8 回答
我发现的最好的工具叫做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
:
Edmund Horner 的原始代码现在最好在他的 github 存储库中找到,并且有人还创建了一个包含两个版本的存储库,您可以从中下载 Juha Jeronen 的版本。我已经制作了一个干净的版本,将他们的贡献结合到我自己的存储库中,只是为了 pyan,因为两个存储库都有很多其他软件。
简而言之,不存在这样的工具。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_obj
也getattr
用于调用其方法之一。这两种方法都使得为 python 创建静态调用图变得极其困难。此外,还有各种难以分析的导入模块的方式。
我认为你最好的选择是坐下来拿着代码库和一张纸,开始手写笔记。这将具有让您更熟悉代码库的双重好处,并且不会轻易被难以解析的场景所欺骗。
SourceTrail 将在这里为您提供帮助。https://www.sourcetrail.com/
Sourcetrail 是一个免费的开源跨平台源代码浏览器,可帮助您在不熟悉的源代码上高效工作。支持 C、C++、Java 和 Python
https://github.com/CoatiSoftware/Sourcetrail
这是文档的链接
https://www.sourcetrail.com/documentation/
请注意,Python 支持相对较新,因此请不要期望它能够完美运行。
我最近(2021 年)在寻找这样的工具,发现似乎在积极维护的code2flow 。
我找到的 pyan3 的工作版本是 1.1.1 ( pip install pyan3==1.1.1
),它的文档在这里
我还在:https ://github.com/zw-normal/pycallgraph 写了一个小工具。代码的概念很容易理解和使用,但它只提供有限的信息,还需要另一个 IDE 才能更好地理解。