繁体   English   中英

创建函数(被调用者,调用者)对的有向图:python`inspect`可以访问当前项目范围之外的模块吗?

[英]Creating Directed graph of function (callee,caller) pairs: can python `inspect` access modules outside current project drectory?

如果这种解释太冗长或不清楚,请发表评论。 我的项目的最终目标是创建一个使用有向无环图networkx使得箭头从每一个来电显示功能吸引到它的身体(类似什么在描述事情的所有被调用函数这个岗位 ,但为Python,而不是C#。 )我的项目目标不是将实时函数调用视为图形,而是查看特定服务器上所有项目之间的静态连接。

本质上,我正在尝试探索继承的代码库的结构。 在我存储所有源代码的服务器上,有许多无关的项目分布在整个文件系统中。

在此示例文件系统中,

/
├── My_Graph_Script/
│   └── digraph.py
│
├── Project_1/
│   ├── A.py
│   └── B.py
│
├── Project_2/
│   ├── C.py
│   └── module_2/
│       ├── D.py
│       └── E.py
│
└── Some_Directory/
    └── Project_3/
        ├── F.py
        ├── G.py
        └── module_3/
            ├── H.py
            └── I.py

我可能想看看之间的主叫方对被叫方

  • A.pyB.py
  • C.pyD.pyE.py
  • F.pyG.pyH.pyI.py

更具体地说,我想生成一个嵌套的字符串字典(和字符串列表),其字典结构如下所示。 我将以此为输入在networkx构建图。 (该示例适用于A.pyB.py

function_call_dict = {
    A.py : {
        function_name_1 : [list,functions,called,in,body_1,&,defined,in,A,or,B],
        function_name_2 : [list,functions,called,in,body_2,&,defined,in,A,or,B]
        }
    B.py : {
        function_name_3 : [list,functions,called,in,body_3,&,defined,in,A,or,B],
        function_name_4 : [list,functions,called,in,body_4,&,defined,in,A,or,B]
        }
}

但是,在构造这样的字典之前,我必须能够从My_Graph_Script项目目录中的非模块python文件访问函数体和定义。

我最初的想法是应用此处看到的方法即可以将许多不同的模块作为for循环的一部分导入,只有我将使用os.walk(root_path)遍历目录树以导入所有必需的模块。 之后,如这里建议的那样,我可以使用inspect将python函数作为对象访问。

由于任何使用inspect脚本都必须先导入模块才能访问其任何功能,是否可以导入完全不同的项目文件夹中或嵌套在文件系统深处的模块(可能没有__init__.py文件)?

另外,如果我的方法完全错误,或者如果已经有开发人员工具通过python代码创建有向无环图,那么我很想知道它们。

[...],或者如果已经有开发人员工具通过python代码创建有向无环图,我很想知道它们。

有两个选项来确定依赖关系图,例如snakefoodfindimports 在IIRC中, snakefood只会解析文本,并且不会加载模块,因此即使在没有__init__.py文件的情况下它也可以正常工作。

IIRC,它们都导出为graphviz的点文件格式,因此您可以使用graphviz进行渲染,也可以将其导入networkx并使用其功能来绘制输出。 如果networkxnetworkx )graphviz布局不能产生足够好的结果(例如,由于节点标签重叠),则可以使用grandalf ,它专门考虑您的用例来实现neato(aka graphviz)布局。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM