У меня есть куча скриптов для выполнения задачи. И мне действительно нужно знать график вызовов проекта, потому что это очень запутанно. Я не могу выполнить код, потому что для этого требуется дополнительный HW и SW. Однако мне нужно понять логику этого. Поэтому мне нужно знать, есть ли инструмент (который не требует выполнения файла python), который может построить граф вызовов с использованием модулей вместо анализатора трассировки или питона. У меня есть такие инструменты для C, но не для python.
Спасибо.
Создайте граф вызовов в python, включая модули и функции?
Ответ 1
Возможно, вы захотите проверить pycallgraph:
Также в этой ссылке описан более ручной подход:
generating-call-graphs-for-understanding-and-refactoring-python-code
Ответ 2
Лучший инструмент, который я нашел, называется pyan
и был изначально написанным Эдмунд Хорнер, улучшил его, а затем с учетом цветности и других функций 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
:
Исходный код Эдмунда Хорнера теперь лучше всего найден в его репозитории github, и кто-то также сделал с обеих версий, откуда вы можете загрузить версию Juha Jeronen. Я сделал чистую версию, объединив их вклад в мой собственный репозиторий только для pyan, поскольку в обоих хранилищах есть много другого программного обеспечения.
Ответ 3
Короче говоря, такой инструмент не существует. 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. Кроме того, существует множество способов анализа способов импорта модулей.
Я думаю, что ваш лучший выбор - сесть за основу кода и блокнот и начать делать заметки вручную. Это будет иметь двойное преимущество, позволяющее вам лучше познакомиться с базой кода и не будет легко обмануто сложными для анализа сценариями.
Ответ 4
Нет такого инструмента для любой программы на любом языке. Создание такого инструмента будет эквивалентно решению проблемы остановки, которая неразрешима. Проще говоря, с учетом произвольной программы и ее ввода нет алгоритма для определения, будет ли программа останавливаться или запускаться вечно. Аналогично, нет алгоритма, который может определить, будет ли функция x вызывать функцию y, или будет выполняться определенная строка кода и т.д. Очевидно, что для определенных программ можно определить эти поведения. Например, однострочная программа с оператором печати будет тривиально выполнять одну строку и выйти. Но произвольные программы могут быть произвольно сложными, поэтому можно доказать, что алгоритм не существует, чтобы определить эти поведения для произвольной программы. К сожалению, вы должны иметь возможность запускать программу для решения этой проблемы.