Znajdowanie pełnej ścieżki w śladzie Pythona

Podczas włączania śledzenia Pythona podaje się nazwę pliku wraz z modułem i kodem źródłowym.

Czy można wyświetlić ścieżkę do pliku, a także nazwę pliku?

Ja używam:

-m trace -t

W poniższym przykładzie są dwa różneaccount_bank_statement.py pliki w różnych katalogach.

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')

To jest duplikat tego (bez odpowiedzi) pytania:Ścieżka śledzenia i numer linii

Odpowiedź, która wymagałaby włamania do modułu śledzenia, zadziałałaby dla mnie.

EDYTOWAĆ

Rozwiązanie oparte na odpowiedzi Alfe poniżej. Tojest natrętny, ale robi to, czego szukam. Zostawiłem nazwę modul, a także dodałem nazwę ścieżki. Pracuję z OpenERP i często jest taka sama nazwa modul zdefiniowana w wielu lokalizacjach.

Nie opublikowałem tej odpowiedzi, ponieważ jest to naprawdę udoskonalenie rozwiązania Alfe, więc jeśli chcesz, proszę głosuj na jego odpowiedź.

(1) Skopiuj trace.py na lokalną ścieżkę (2) Edytuj jak poniżej:

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

Przykładowe wyjście

Zauważ, że istnieją 2 różne nazwy modułów, zawarte w różnych katalogach, z tymi samymi nazwami plików. Ten zmodyfikowany * trace.py ** obsługuje to.

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')

questionAnswers(1)

yourAnswerToTheQuestion