加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

跟踪python解释器的执行路径

发布时间:2020-12-20 13:46:11 所属栏目: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
以下工作很好地了解解释器的作用:

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)

我在文档中找不到解决方案:
https://docs.python.org/2/library/trace.html

更新
如果有不同的方式来获得结果,例如一个不同的python包(不是跟踪),这也是一个很好的解决方案.

更新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()
foo.py:f.my_func()
bar.py:print(‘#in my_func()’)
bar.py:inner()
bar.py:print(‘in in inner’)
bar.py:返回’内部’
bar.py:返回1

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,您将看不到模块级别的行的跟踪输出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读