以下内容可以很好地展示解释器的工作过程:
我在文档中找不到解决方案:https://docs.python.org/2/library/trace.html 更新:如果有其他方法可以获得结果,例如不使用trace的不同python包,那么这也是一个好的解决方案。
更新2:跟踪应该是非交互式的。
更新3:我尝试了Martin v. Löwis提供的解决方案。 在某些情况下它有效,但并不总是有效。
文件foo.py
如果我调用foo.py,期望的结果类似于这样:
foo.py: f=bar.Foo() foo.py: f.my_func() bar.py: print('#在my_func()中') bar.py: inner() bar.py: print('#在inner中') bar.py: return 'inner' bar.py: return 1
trace2.py的结果
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 更新:如果有其他方法可以获得结果,例如不使用trace的不同python包,那么这也是一个好的解决方案。
更新2:跟踪应该是非交互式的。
更新3:我尝试了Martin v. 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('#在my_func()中') bar.py: inner() bar.py: print('#在inner中') bar.py: return 'inner' bar.py: return 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)
这样的东西在导入期间执行。
我猜测代码加载和执行的检测并没有涵盖所有情况。