如何从交互式shell访问调用源代码行

时间:2012-11-02 22:57:01

标签: python

我想创建一个可以确定调用方式的源代码的函数。我知道如何使用检查模块进行此操作。例如,this question效果很好,并在lines变量中提供了我想要的输出,如下所示:

def hello(x):
   frame,filename,line_number,function_name,lines,index=\
       inspect.getouterframes(inspect.currentframe())[1]
   print(frame,filename,line_number,function_name,lines,index)

问题是此解决方案在交互式命令行会话中不起作用。例如,从命令行,结果如下所示:

>>> y = hello(7)
(<frame object at 0x01ECA9E8>, '<stdin>', 1, '<module>', None, None)

问题是源文件是'<stdin>',因此lines变量是None。如何在交互式会话期间访问调用行以查找包含字符串y = hello(7)的结果?

1 个答案:

答案 0 :(得分:2)

正如@abarnert所述,这可能是不可能的。但是,至少有部分解决方法。

获取源代码行不是最大的问题;像readline这样的模块会跟踪它们。交互式Python和iPython以不同的方式暴露他们的行(叹息),但也可以均衡。 (例如,我的show包执行此操作;其linecacher模块放置一个胶合代码以均衡普通Python的源访问和不同的交互式风格。)

更大的问题是,即使您拥有源代码,inspect也不会提供合法的行号(例如inspect.currentframe().f_back.f_lineno在普通代码中效果很好,但会提供类似1或点的值交互式调用时<stdin>中的调用。)

但我还没准备好把它称之为不可能。基于交互式Python和iPython生成的回溯,似乎有足够的信息可用于重建“此调用来自何处?”需要多少努力,以及答案的稳健程度......这些都是悬而未决的问题。