Пожалуйста, оставьте комментарий, если это объяснение многословно или если я не ясен;конечная цель моего проекта - создать направленный ациклический граф, используя 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.py
и B.py
C.py
, D.py
и E.py
F.py
,G.py
, H.py
и I.py
Более конкретно, я хотел бы создать вложенный словарь строк (и списков строк) со следующей структурой, показанной ниже.Я буду использовать это как входные данные для построения графиков в networkx
.(пример для A.py
и B.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]
}
}
Однако, прежде чем я смогу создать такой словарь, я должен иметь возможность получить доступ к телам функций и определениям из файлов Python, которые не 't модулей в каталоге проекта My_Graph_Script
.
. Сначала я хотел применить подход , показанный здесь , где можно импортировать много разных модулей как часть цикла for, только я бы пошелдерево каталогов с os.walk(root_path)
для импорта всех необходимых модулей.После этого я мог бы использовать inspect
для доступа к функциям Python как к объектам, как предлагается здесь .
Поскольку любой сценарий, использующий inspect
, должен сначала импортироватьмодуль для доступа к любой из его функций, возможно ли импортировать модули, которые находятся в совершенно разных папках проекта или вложены где-то глубоко в файловой системе, возможно, без файла __init__.py
?
Кроме того, если мой подход совершенно неправильный, или если уже есть инструменты разработчика, создающие направленные ациклические графы из кода Python, я хотел бы знать о них.