Поиск полного пути в трассировке Python

При включении трассировки Python указывается имя файла, модуль и исходный код.

Можно ли показать путь к файлу, а также имя файла?

Я использую:

-m trace -t

В приведенном ниже примере есть два разныхaccount_bank_statement.py файлы в разных каталогах.

17  --- modulename: account_bank_statement, funcname: button_create_invoice
18 account_bank_statement.py(329):         if context is None:
19 account_bank_statement.py(333):         currency =  self.read(cr, uid, ids, ['currency'])[0]['currency']
20  --- modulename: account_bank_statement, funcname: _currency
21 account_bank_statement.py(107):         res = {}
22 account_bank_statement.py(108):         res_currency_obj = self.pool.get('res.currency')

Это дубликат этого (без ответа) вопроса:Трассировка пути и номера строки

Ответ, который будет включать в себя взлом модуля трассировки, будет работать для меня.

РЕДАКТИРОВАТЬ

Решение, основанное на ответе Alfe ниже. Этоявляется навязчиво, но делает то, что я ищу. Я оставил modulename, а также добавил путь. Я работаю с OpenERP, и часто одно и то же имя модуля определяется в нескольких местах.

Я не разместил этот ответ, так как это действительно уточнение решения Альфе, поэтому, если хотите, пожалуйста, проголосуйте за его ответ.

(1) Скопируйте trace.py в локальный путь (2) Отредактируйте, как показано ниже:

171 def modname(path):
172     """Return a plausible module name for the patch."""
173 
174     base = os.path.basename(path)
175     filename, ext = os.path.splitext(base)
176     return filename

593     def globaltrace_lt(self, frame, why, arg):
594         """Handler for call events.
595 
596         If the code block being entered is to be ignored, returns `None',
597         else returns self.localtrace.
598         """
599         if why == 'call':
600             code = frame.f_code
601             filename = frame.f_globals.get('__file__', None)
602             if filename:
603                 # XXX modname() doesn't work right for packages, so
604                 # the ignore support won't work right for packages
605                 #modulename = fullmodname(filename)
606                 modfile, ext = os.path.splitext(filename)
607                 modulename = fullmodname(modfile)
608                 if modulename is not None:
609                     ignore_it = self.ignore.names(modfile, modulename)
610                     if not ignore_it:
611                         if self.trace:
612                             print (" --- modulename: %s, funcname: %s, filename: %s"
613                                    % (modulename, code.co_name, filename))
614                         return self.localtrace
615             else:
616                 return None

Пример вывода

Обратите внимание, что в разных каталогах содержатся два разных имени модуля с одинаковыми именами. Этот модифицированный * trace.py ** обрабатывает это.

2  --- modulename: register_accounting, funcname: button_create_invoice, filename: /home/sean/unifield/utp729/unifield-wm/register_accounting/account_bank_statement.pyc
3 account_bank_statement.py(329):         if context is None:
4 account_bank_statement.py(333):         currency =  self.read(cr, uid, ids, ['currency'])[0]['currency']
5  --- modulename: account, funcname: _currency, filename: /home/sean/unifield/utp729/unifield-addons/account/account_bank_statement.pyc
6 account_bank_statement.py(107):         res = {}
7 account_bank_statement.py(108):         res_currency_obj = self.pool.get('res.currency')

Ответы на вопрос(1)

Ваш ответ на вопрос