【问题标题】:Finding full pathname in a Python trace在 Python 跟踪中查找完整路径名
【发布时间】:2014-01-06 21:42:25
【问题描述】:

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

这是这个(未回答的)问题的副本:Tracing fIle path and line number

涉及破解跟踪模块的答案对我有用。

编辑

一个解决方案,基于下面 Alfe 的回答。它侵入性的,但可以满足我的需求。我留下了模块名并添加了路径名。我正在使用 OpenERP,并且经常在多个位置定义相同的模块名称。

我没有发布这个答案,因为它确实是对 Alfe 解决方案的改进,所以如果你愿意,请投票给他的答案。

(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

样本输出

请注意,有 2 个不同的模块名称,包含在不同的目录中,具有相同的文件名。这个修改后的 *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')

【问题讨论】:

标签: python trace


【解决方案1】:

如果允许修补trace.py,则此任务很简单。

trace.py(在我的例子中是/usr/lib/python2.7/)复制到本地目录(例如当前目录),然后在该本地副本中修补函数modname(path)。该功能将目录从模块路径中剥离,因此包信息丢失。原文包含这一行

filename, ext = os.path.splitext(base)

可以改成

filename, ext = os.path.splitext(path)

为了剥离目录。

./trace.py --trace t.py 这样的调用的输出如下所示:

 --- modulename: t, funcname: <module>
t.py(3): import mypackage.mymodule
 --- modulename: mypackage/__init__, funcname: <module>
__init__.py(1):   --- modulename: mypackage/mymodule, funcname: <module>
mymodule.py(1): print 42
42
t.py(5): print 5
5
 --- modulename: ./trace, funcname: _unsettrace
trace.py(80):         sys.settrace(None)

我正在跟踪一个名为t.py 的测试脚本,该脚本导入了一个模块mymodule.py,该模块位于包mypackage 中(因此文件名是./mypackage/mymodule.py)。该模块仅打印 42,测试脚本本身打印 5。

这能解决您的问题吗?

编辑:

根据第二个观点,我提出了一个不同的补丁。

在函数globaltrace_lt() 中,模块名称是通过调用modname() 导出的;修补此呼叫fullmodname()

            modulename = fullmodname(filename)

我认为这可能是一个侵入性较小的补丁。

【讨论】:

  • 您好,Alfe,感谢您的回答。它确实解决了这个问题,谢谢。它确实引入了一个不同的问题: --ignore-module 现在必须包含完整路径。
  • 嗯,是的,这可能是一个合乎逻辑的结果并且是可取的吗?
  • 但在进一步检查代码时,我有不同的建议。在上面的答案中查看我的编辑。
  • 感谢您的帮助阿尔夫。我已经解决了继承模型非标准的 OpenERP 上真正的问题。
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多