Создание направленного графа пар функций (вызываемый, вызывающий): может ли Python `проверять` модули доступа вне директории текущего проекта? - PullRequest
0 голосов
/ 10 июля 2019

Пожалуйста, оставьте комментарий, если это объяснение многословно или если я не ясен;конечная цель моего проекта - создать направленный ациклический граф, используя 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, я хотел бы знать о них.

1 Ответ

1 голос
/ 10 июля 2019

[...], или если уже есть инструменты разработчика, создающие направленные ациклические графы из кода Python, я бы хотел узнать о них.

Существует несколько опций для определения графика зависимости, например snakefood и findimports. IIRC, snakefood просто анализирует текст и не загружает модуль, поэтому он должен работать даже при отсутствии файлов __init__.py.

IIRC, они оба экспортируют в точечный формат файла graphviz, так что вы можете отрендерить их с помощью graphviz или импортировать их в networkx и использовать его функциональные возможности для вывода результатов. Если компоновка networkx (py-) graphviz не дает достаточно хороших результатов (например, из-за перекрытия меток узлов), существует grandalf , который реализует компоновку neato (aka graphviz) специально для вашего варианта использования в уме.

...