Подтвердить что ты не робот

Создайте граф вызовов в python, включая модули и функции?

У меня есть куча скриптов для выполнения задачи. И мне действительно нужно знать график вызовов проекта, потому что это очень запутанно. Я не могу выполнить код, потому что для этого требуется дополнительный HW и SW. Однако мне нужно понять логику этого. Поэтому мне нужно знать, есть ли инструмент (который не требует выполнения файла python), который может построить граф вызовов с использованием модулей вместо анализатора трассировки или питона. У меня есть такие инструменты для C, но не для python.
Спасибо.

4b9b3361

Ответ 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:

вывод pyan на себя

Исходный код Эдмунда Хорнера теперь лучше всего найден в его репозитории 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, или будет выполняться определенная строка кода и т.д. Очевидно, что для определенных программ можно определить эти поведения. Например, однострочная программа с оператором печати будет тривиально выполнять одну строку и выйти. Но произвольные программы могут быть произвольно сложными, поэтому можно доказать, что алгоритм не существует, чтобы определить эти поведения для произвольной программы. К сожалению, вы должны иметь возможность запускать программу для решения этой проблемы.