图形化显示 Python 函数之间的调用关系

摘要:
if__name__==“__main__”:#以下是config=config()#diagram中包含的函数名#如果它是某个类的函数,例如gobang类,则可以直接编写'gobang.*'以表示以五子棋开始的所有函数。config.trace_Filter=GlobbingFilter#此部分用于确定图形中未包含哪些函数。

0X01 安装方法

1.下载并安装graphviz

下载地址: https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

注意:安装路径可任意选择

2.配置环境变量

比如我的安装路径是

E:Graphviz2.38

那么就在系统环境变量 path 中添加下面的项

E:Graphviz2.38in

3.安装 pycallgraph

pip install pycallgraph

0X02 使用方法

1.在项目主函数所在文件中引入依赖包

比如如果我分析的是 sqlmap ,那么我们可以在 sqlmap.py 中添加下面的依赖

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from pycallgraph import Config
from pycallgraph import GlobbingFilter

如下图所示:

图形化显示 Python 函数之间的调用关系第1张

注意:

这里有一个点就是有些项目可能会规定某些 import

必须在第一行,那么如果这时候你把这个引用放在最上面可能项目不能正常运行,这要根据不同的项目而定

2.设定要显示或者不要显示的函数

我们在 if __name__ == "__main__": 下,main() 之上可设置我们想要在图中显示的函数和想要隐藏的函数(这个设置不是必须的,在我的使用中就没有特殊的需要,我便没有设置)

def main():
    # 你的主函数代码。

if __name__ == "__main__":
    # 下面是添加部分
    config = Config()
    # 关系图中包括(include)哪些函数名。
    #如果是某一类的函数,例如类gobang,则可以直接写'gobang.*',表示以gobang.开头的所有函数。(利用正则表达式)。
    config.trace_filter = GlobbingFilter(include=[
        'main',
        'draw_chessboard',
        'draw_chessman',
        'draw_chessboard_with_chessman',
        'choose_save',
        'choose_turn',
        'choose_mode',
        'choose_button',
        'save_chess',
        'load_chess',
        'play_chess',
        'pop_window',
        'tip',
        'get_score',
        'max_score',
        'win',
        'key_control'
    ])
    # 该段作用是关系图中不包括(exclude)哪些函数。(正则表达式规则)
    # config.trace_filter = GlobbingFilter(exclude=[
    #     'pycallgraph.*',
    #     '*.secret_function',
    #     'FileFinder.*',
    #     'ModuleLockManager.*',
    #     'SourceFilLoader.*'
    # ])
    ...

3.main()前调用我们的绘图函数

...
graphviz = GraphvizOutput()
graphviz.output_file = 'graph.png'
with PyCallGraph(output=graphviz, config=config):
    main()

如图所示:

图形化显示 Python 函数之间的调用关系第2张

注意:

因为我这里没有特别的配置于是 PyCallGraph() 函数里没有上面代码中的 config 选项

0X03 运行结果

1.运行我的 sqlmap.py

图形化显示 Python 函数之间的调用关系第3张

2.在当前目录下生成指定图片

图形化显示 Python 函数之间的调用关系第4张

3.图片效果

图形化显示 Python 函数之间的调用关系第5张

0X04 总结

现在可以愉快地开始我们的分析之旅了!

0X05 参考

https://blog.csdn.net/qq_36408085/article/details/82952846

https://blog.csdn.net/Marksinoberg/article/details/52809192

转载自:https://www.k0rz3n.com/2019/02/22/%E5%9B%BE%E5%BD%A2%E5%8C%96%E6%98%BE%E7%A4%BA%20Python%20%E5%87%BD%E6%95%B0%E4%B9%8B%E9%97%B4%E7%9A%84%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB/

免责声明:文章转载自《图形化显示 Python 函数之间的调用关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇@EnableAsync@Async使用总结爬虫cookies详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转载)lua和c/c++互相调用实例分析

http://www.cppblog.com/lxyfirst/archive/2008/10/29/65447.html lua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使用lua实现,配合c/c++实现的底层接口服务,能够大大降低系统的维护成本。下面对lua和c/c++的交互调用做一个实...

Debian安装配置常用软件

1、安装j2sdk,下载j2sdk-1_4_2_09-linux-i586-rpm.bin文件,chmod 755 j2sdk-1_4_2_09-linux-i586-rpm.bin,运行后得到.rpm文件,用alien转换为.deb包,然后dpkg -i  xxx.deb即可,安装后的文件在/usr/java目录; Update: 在debian里用上面...

Python Linux系统管理之文件与文件路径管理

一、介绍 在 Linux 中,操作系统提供了很多的命令(例如:ls、cd),用于文件和目录管理。在 Python 中,有一个 os 模块,也提供了许多便利的方法来管理文件和目录。 二、os 模块 os:语义为操作系统。所以,os 模块提供的肯定是操作系统相关的功能了(与具体的平台无关)。 如果用 dir() 查看 os,会发现内容相当多。下面,只列出文件和...

python数组操作

python中的数组其实就是list,但它更像是java的arraylist,而且功能比arraylist更强大。因为python的list其实是个对象,所以对于他的操作和删除比较有讲究。 创建列表sample_list = ['a',1,('a','b')]Python 列表操作sample_list = ['a','b',0,1,3]得到列表中的某一个...

python中print函数的使用小技术-使用分隔符和行尾符

关于python3中,print函数,可以同时打印输出多个和多种类型数据,如下: >>> print(1,"abc",2,"https://www.cnblogs.com/5201351",True) 1 abc 2 https://www.cnblogs.com/5201351True >>> 如上可以看出,各项默认以...

Windows系统中CreateFileMapping实现的共享内存及用法

在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模式。 每个进程都有独立的4GB逻辑地址空间,32位的Windows系统允许每一个进程独立访问自己的内存,即独立于其它进程,也即它自己的32位逻辑地址空间。操作...