跟踪python解释器的执行路径
|
以下工作很好地了解解释器的作用:
python -m trace --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t path-to/script.py 但是线路太多了.我想隐藏导入文件时发生的行. 示例:我对这样的行不感兴趣: saved_filter.py(9): class SavedFilter(models.Model):
saved_filter.py(10): name = models.TextField(max_length=256)
saved_filter.py(11): user = models.ForeignKey('auth.User',null=True,blank=True)
我在文档中找不到解决方案: 更新 更新2 更新3 我尝试了Martinv.L?wis提供的解决方案.它在某些情况下有效,但不是全部. 文件foo.py import bar
def main():
f=bar.Foo()
f.my_func()
if __name__=='__main__':
main()
文件bar.py class Foo(object):
def my_func(self):
def inner():
print('#in inner')
return 'inner'
print('#in my_func()')
inner()
return 1
如果我调用foo.py,想要的结果看起来类似于: foo.py:f = bar.Foo() trace2.py的结果 > python tmp/trace2-orig.py --trace tmp/foo.py
--- modulename: foo,funcname: <module>
--- modulename: bar,funcname: Foo
bar.py(1): class Foo(object): <======= Import lines
bar.py(2): def my_func(self):
--- modulename: foo,funcname: main
foo.py(4): f=bar.Foo()
foo.py(5): f.my_func()
--- modulename: bar,funcname: my_func
bar.py(3): def inner():
bar.py(6): print('#in my_func()')
#in my_func()
bar.py(7): inner()
--- modulename: bar,funcname: inner
bar.py(4): print('#in inner')
#in inner
bar.py(5): return 'inner'
bar.py(8): return 1
--- modulename: trace,funcname: _unsettrace
trace.py(80): sys.settrace(None)
不幸的是,仍然存在类Foo(对象),它是在导入期间执行的. 我猜测代码加载和执行的检测并不包括所有情况. 解决方法
如果您创建脚本trace2.py为
import trace
OrigTrace = trace.Trace
class Trace2(trace.Trace):
def localtrace_trace(self,frame,why,arg):
if why == "line" and frame.f_code.co_name == '<module>':
return self.localtrace
return OrigTrace.localtrace_trace(self,arg)
trace.Trace=Trace2
trace.main()
并运行python -m trace2 -t script.py,您将看不到模块级别的行的跟踪输出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
