下面的代码很好地展示了解释器的功能:
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)
,这是在导入过程中执行的内容。在
我想代码加载和执行的检测并不能覆盖所有情况。在
您可以使用pdb library,通过这个库,您可以创建断点和/或通过交互式控制台UI将python语句注入断点行,并执行更多其他操作。 ;)
如果创建脚本trace2.py as
然后运行
python -m trace2 -t script.py
您将看不到来自模块级别的行的跟踪输出。在如果您只想在导入过程中隐藏代码路径,只需通过一个类似这样的过滤器:
相关问题 更多 >
编程相关推荐