python - Python - 导入函数的局部变量
问题描述
我正在尝试创建一个调试器函数,当出现错误时调用该函数,并让我访问控制台,以便检查程序中发生了什么。这是基本功能:
def DEBUGGER(error):
print(error)
print("[DEBUGGER] Your program has failed, here is the debugger. Enter EXIT to end program.")
while True:
line = input(">>> ").lower()
if line == 'exit':
sys.exit(0)
else:
try:
exec(line)
except Exception as e:
print(str(e))
问题是我无法输入类似print(var)
的内容,因为它在另一个函数中被引用。全局函数对我没有帮助,因为我希望能够在我的程序中调用任何变量,并且我不能将它们全部全球化。我知道我可以通过将所有函数放在类中来解决它,但我不能很多原因。
有没有办法获取正在运行的函数的局部变量?(当我调用DEBUGGER()
时,母亲功能仍在运行)
如果不是,我可以导出当前函数的局部变量并将其作为参数传递给DEBUGGER()
吗?
感谢您的回答。
解决方案
您基本上是在重新实现Python 调试器pdb
。如果你想走这条路,你可能想研究源代码。pdb
它本身是一个围绕低级bdb
(基本调试器)模块的用户界面,并且它的源代码也是可用的。
回答您的直接问题:当您捕获异常时,您可以访问回溯对象(通过exception.__traceback__
或通过sys.exc_info()
),并且回溯可以通过属性访问堆栈中每个帧的本地和全局命名空间tb_frame
。该属性设置为具有和属性的框架对象。f_locals
f_globals
该bdb.Bdb.get_stack()
方法可能是一个关于如何处理回溯的有趣示例,然后使用内部pdb.Pdb._select_frame()
方法从堆栈中选择一个帧以使用局部变量和全局变量。
如果您不想重新实现完整的调试器,可以使用pdb.pm()
orpdb.port_mortem()
函数。这些获取最后一次提出的回溯,并让您在交互式环境中检查堆栈帧:
try:
exec(line)
except Exception as e:
pdb.post_mortem(e.__traceback__)
推荐阅读
- python - 在 Docker 容器中导入 python 文件
- asterisk - 使用 AsterNET.ARI 执行 Asterisk 语音识别应用程序
- laravel - 如何在 virtualmin 上部署 laravel 项目?
- python - 使用startswith检查数据框中的列
- c# - 如何使用 Any(x => DbFunctions.Like()) 优化 LINQ Where 条件
- java - 删除外部调度程序 servlet 并在 spring boot 中使用嵌入的
- r - 打印 tibble 及其行名
- laravel - Heroku 已部署但未更新
- python - 正常函数声明在 discord.py cog 中不起作用
- python - 如何从dict返回某些键、值并打印新的dict