python interp的跟踪执行路径

2021-05-13 08:05:57 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码很好地展示了解释器的功能:

python -m trace --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t path-to/script.py

但是有太多的线。我想隐藏在导入文件时发生的行。在

示例:我对这样的行不感兴趣:

^{pr2}$

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

更新 如果有不同的方法来获得结果,例如不同的python包(而不是trace),这也是一个很好的解决方案。在

更新2 跟踪应该是非交互式的。在

更新3

我尝试了马丁v Löwis提供的解决方案。它在某些情况下有效,但不是全部。在

文件食品在

import bar

def main():
    f=bar.Foo()
    f.my_func()

if __name__=='__main__':
    main()

文件棒.py在

class Foo(object):
    def my_func(self):
        def inner():
            print('#in inner')
            return 'inner'
        print('#in my_func()')
        inner()
        return 1

如果我打电话食品,所需结果如下所示:

在食品:f=酒吧。福() 食品:f.我的函数() 棒.py:print('#在my_func()'中) 棒.py:内部() 棒.py:打印(“#在内部”) 棒.py:return“内部” 棒.py:返回1

trace2.py的结果

> python tmp/trace2-orig.py --trace tmp/foo.py 
 --- modulename: foo, funcname: <module>
 --- modulename: bar, 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)

不幸的是,仍然存在class Foo(object),这是在导入过程中执行的内容。在

我想代码加载和执行的检测并不能覆盖所有情况。在

3条回答
网友
1楼 ·

如果您只想在导入过程中隐藏代码路径,只需通过一个类似这样的过滤器:

import re
import sys

cur = None
skip_re = re.compile(r'^(?P<filename>.+)?\((\d*)\):\s*import')
for line in sys.stdin:
    if cur and not line.startswith(cur):
        continue
    cur = None
    match = skip_re.match(line)
    if match:
        cur = match.group('filename')
    sys.stdout.write(line)
网友
2楼 ·

您可以使用pdb library,通过这个库,您可以创建断点和/或通过交互式控制台UI将python语句注入断点行,并执行更多其他操作。 ;)

网友
3楼 ·

如果创建脚本trace2.py as

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, frame, why, arg)

trace.Trace=Trace2
trace.main()

然后运行python -m trace2 -t script.py您将看不到来自模块级别的行的跟踪输出。在

相关问题