python - 如何从交互式 shell 访问调用源行

标签 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)

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

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

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

最佳答案

这可能是不可能的,如 @abarnert说。不过,至少有部分解决方法。

获取源代码行并不是最大的问题;模块如 readline跟踪他们。交互式 Python 和 iPython 的行显示方式略有不同(叹气),但这也可以等同。 (例如,我的 show 包就是这样做的;它的 linecacher 模块添加了一个饰面,以平衡普通 Python 和不同交互风格的源访问。)

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

但我还没有准备好说这是不可能的。根据交互式 Python 和 iPython 生成的回溯,似乎可能有足够的信息可用于重建“此调用来自何处?”这需要付出多少努力,答案有多可靠......这些都是悬而未决的问题。

关于python - 如何从交互式 shell 访问调用源行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13204161/

相关文章:

Python:获取姐妹目录中文件的路径?

python - 如何查看opencv的python文档?

python - BeautifulSoup 在 findAll 中排除一个标签

python - 添加新元素后,lxml 库不向树添加换行符或缩进

python - sqlalchemy.exc.CircularDependencyError : Can't sort tables for DROP; an unresolvable foreign key dependency exists between tables

python - 我可以通过 gsl_function 的包装或 cython 重新声明将 cython 类方法分配给 gsl_function 结构吗?

python - 适当的类和属性结构

python - 我怎样才能清理 exec 的使用,无法让 setattr 来完成这项工作?

python - Flask-SQLAlchemy - 模型没有属性 'foreign_keys'

Python 检查白天