Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python跟踪中查找完整路径名_Python_Trace - Fatal编程技术网

在Python跟踪中查找完整路径名

在Python跟踪中查找完整路径名,python,trace,Python,Trace,启用Python跟踪时,将提供文件名以及模块和源代码 是否可以显示文件路径和文件名 我正在使用: -m trace -t 在下面的示例中,在不同的目录中有两个不同的account\u bank\u statement.py文件 17 --- modulename: account_bank_statement, funcname: button_create_invoice 18 account_bank_statement.py(329): if context is No

启用Python跟踪时,将提供文件名以及模块和源代码

是否可以显示文件路径和文件名

我正在使用:

-m trace -t
在下面的示例中,在不同的目录中有两个不同的account\u bank\u 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')
这是这个(未回答)问题的重复:

一个涉及入侵跟踪模块的答案对我来说是可行的

编辑

一个解决方案,基于下面阿尔夫的回答。它是侵入性的,但它确实是我想要的。我留下了modulename,还添加了路径名。我正在使用OpenERP,通常在多个位置定义相同的modulename

我没有发布这个答案,因为它实际上是对阿尔夫解决方案的改进,所以如果你喜欢,请投票支持他的答案

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

如果允许修补
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)

我想这可能是一个不那么麻烦的补丁。

嗨,阿尔夫,谢谢你的回答。这确实解决了问题,谢谢。它确实引入了一个不同的问题:--ignore模块现在必须包含完整的路径。好吧,是的,这可能是一个逻辑结果,这样做是可取的?但是在进一步检查代码时,我有一个不同的建议。在上面的答案中看到我的编辑。谢谢你的帮助。我已经解决了OpenERP上的一个实际问题,继承模型是非标准的。相关:我已经回答了重复的帖子,希望它也能对你有用。
            modulename = fullmodname(filename)