Как предотвратить попадание pycallgraph в стандартные библиотечные функции?
Я использую pycallgraph из командной строки в профиль и рисую график вызовов относительно простой программы. Однако результирующее изображение включает в себя внутренние стандартные библиотеки (threading, json, socket), хотя я не использую параметр командной строки -s. Использование опции -e для исключения этих модулей не имеет эффекта, а использование -i приводит к пустой диаграмме вызовов. Я также пробовал cProfile, но он отображает только основной поток.
Как я могу сделать pycallgraph, чтобы показывать только вызовы в моем коде? Текущий беспорядочный результат бесполезен.
Изменить: я использую 0.5.1, доступный через easy_install. Запуск pycallgraph./cursesclient.py выводит это:
. Как вы можете видеть, pycallgraph показывает внутренности модулей json, re, encodings, socket и threading. Re и encodings никогда даже не вызываются непосредственно в моем коде, а через json и socket соответственно.
Ответы
Ответ 1
pycallgraph имеет недокументированный метод stop_trace(), который можно использовать для исключения разделов кода. Что-то вроде
import pycallgraph
import mycode
import stuff_i_dont_want_to_see
pycallgraph.start_trace()
#Initializations
pycallgraph.stop_trace()
stuff_i_dont_want_to_see()
pycallgraph.start_trace()
mycode.things()
pycallgraph.make_dot_graph('cleaner_graph.png')
Это то, что вам нужно?
источник
Ответ 2
Pycallgraph предоставляет возможности фильтрации для фильтрации любого модуля, класса или функции, которые вы хотели бы исключить из графика вызовов. Следующая функция должна быть определена до начала трассировки и передана на pycallgraph
Пример
def filtercalls(call_stack, modul, clas, func, full):
mod_ignore = ['shutil','scipy.optimize','re','os','sys','json']
func_ignore = ['CustomFunctionName','pdbcall']
clas_ignore = ['pdb']
return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore
Начало трассировки пикаграфа
pycallgraph.start_trace(filter_func=filtercalls)
Таким образом, любой модуль, класс или функция, которые вы предоставляете в фильтрах, будут удалены. Обратите внимание, что много раз в стандартных библиотеках, содержащих только имя модуля, недостаточно. Таким образом, включение numpy в mod_ignore все равно приведет к включению numpy.core