Модуль трассировки и файловые пути Python


Я использую модуль python trace для отслеживания выполнения некоторого кода. Я замечаю, что когда исполнение позже печатается, оно печатается в следующем виде (минимальный рабочий пример приведен ниже):

<filename>(<line number>): <line of code>

Можно получить полный (абсолютный или относительный) путь к файлу, а не только имя файла. Имеет смысл, что где-то в вызове trace.Trace должен быть флаг, который позволит мне это сделать, но я, кажется, не могу найти такой параметр в вызове trace.Trace. доктора.

Если такого флага не существует, как я могу получить путь к файлу? Я думаю, что я мог бы проверить все каталоги в sys.path, но как я тогда буду обрабатывать случаи, когда два разных каталога имеют файлы с одинаковым именем?

1 2

1 ответ:

Это было не очень очевидно, но я обнаружил, что если я использую параметр countfuncs в trace, или параметр --listfuncs, Если я использую trace из командной строки, я получаю полные имена путей. Таким образом, для программы:

import trace
from recurse import recurse

tracer = trace.Trace(count=False, trace=True, countfuncs=True)
tracer.run('recurse(2)')
tracer.results().write_results()

... (используя пример Дуга Хеллмана из здесь ) я получаю следующий результат:

functions called:
filename: <string>, modulename: <string>, funcname: <module>
filename: C:\Python33\lib\encodings\cp850.py, modulename: cp850, funcname: IncrementalEncoder.encode
filename: C:\Python33\lib\trace.py, modulename: trace, funcname: _unsettrace
filename: C:\usr\sjl\dev\test\python\recurse.py, modulename: recurse, funcname: recurse

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