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