以下工作非常适合查看解释器的功能:
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: <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)
。
我猜测代码加载和执行的检测并未涵盖所有情况。
答案 0 :(得分:1)
如果您将脚本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, frame, why, arg)
trace.Trace=Trace2
trace.main()
并运行python -m trace2 -t script.py
,您将看不到模块级别的行的跟踪输出。
答案 1 :(得分:0)
您可以使用pdb library,通过此库,您可以通过交互式控制台UI创建断点和/或将python语句注入到断点行,并执行更多其他操作。 ;)
答案 2 :(得分:0)
如果您只是想在导入过程中隐藏代码路径,只需通过这样的过滤器管道:
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)