Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从交互式shell访问呼叫源线路_Python - Fatal编程技术网

Python 如何从交互式shell访问呼叫源线路

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

我想做一个函数,可以确定如何调用它的源代码。我知道通常如何使用inspect模块执行此操作。例如,工作正常,并在
行中提供所需的输出,如下所示:

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
的行并将其传递(这可能不正确,但您可以通过反复试验找到正确的详细信息),您可以将其编入索引。