Finden des vollständigen Pfadnamens in einem Python-Trace

Wenn Sie den Python-Trace aktivieren, wird der Dateiname zusammen mit dem Modul und dem Quellcode bereitgestellt.

Ist es möglich, sowohl den Dateipfad als auch den Dateinamen anzuzeigen?

Ich benutze:

-m trace -t

Im folgenden Beispiel gibt es zwei verschiedeneaccount_bank_statement.py Dateien in verschiedenen Verzeichnissen.

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

Dies ist ein Duplikat dieser (nicht beantworteten) Frage:Verfolgung von Dateipfad und Zeilennummer

Eine Antwort, die das Hacken des Trace-Moduls beinhalten würde, würde für mich funktionieren.

BEARBEITEN

Eine Lösung, basierend auf der Antwort von Alfe unten. Esist aufdringlich, macht aber was ich suche. Ich habe den Modulnamen verlassen und auch den Pfadnamen hinzugefügt. Ich arbeite mit OpenERP und an mehreren Stellen ist oft derselbe Modulname definiert.

Ich habe hier keine Antwort gepostet, da es sich wirklich um eine Verfeinerung von Alfs Lösung handelt. Wenn Sie also möchten, stimmen Sie bitte über seine Antwort ab.

(1) Kopieren Sie trace.py in Ihren lokalen Pfad. (2) Gehen Sie wie folgt vor:

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

Beispielausgabe

Beachten Sie, dass zwei verschiedene Modulnamen in verschiedenen Verzeichnissen mit denselben Dateinamen enthalten sind. Diese geänderte * trace.py ** verarbeitet dies.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage