Python 如何从交互式shell访问呼叫源线路
我想做一个函数,可以确定如何调用它的源代码。我知道通常如何使用inspect模块执行此操作。例如,工作正常,并在Python 如何从交互式shell访问呼叫源线路,python,Python,我想做一个函数,可以确定如何调用它的源代码。我知道通常如何使用inspect模块执行此操作。例如,工作正常,并在行中提供所需的输出,如下所示: def hello(x): frame,filename,line_number,function_name,lines,index=\ inspect.getouterframes(inspect.currentframe())[1] print(frame,filename,line_number,function_name
行中提供所需的输出,如下所示:
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)
y=你好(7)
(,'',1',,无,无)
问题是源文件是
'
,因此行
变量是None
。如何在交互式会话期间访问呼叫线路以查找包含字符串y=hello(7)
的结果?如前所述,这可能是不可能的。然而,至少有部分解决办法
获取源代码行并不是最大的问题;像这样的模块会跟踪它们。交互式Python和iPython公开它们的代码行略有不同(叹气),但这也可以得到平衡。(例如,我的包就是这样做的;它的linecacher
模块为普通Python和不同交互风格的源代码访问提供了一个平衡。)
更大的问题是,即使有了源代码,inspect
也不能提供合法的行号(例如,inspect.currentframe().f_back.f_lineno
在普通代码中工作得很好,但在交互调用时会给出类似于1的值或
中的调用点。)
但我还没准备好说这是不可能的。基于交互式Python和iPython生成的回溯,似乎有足够的信息可用于重建“此调用来自何处?”需要付出多少努力,以及答案的可靠性……这些都是开放性问题。你不能,因为交互式会话不跟踪键入的行。如果您愿意要求
ipython
,可能有一种方法可以做到这一点。或者,您可以围绕交互式会话编写自己的包装器,只跟踪读入stdin
的行并将其传递(这可能不正确,但您可以通过反复试验找到正确的详细信息),您可以将其编入索引。