在正在运行的作业中读取python变量

时间:2016-08-17 12:00:27

标签: python shell

我已经启动了一个需要很长时间才能完成的python脚本,而且很傻我忘了在我的脚本中不时打印出重要变量的值,例如估计计算的进度我是这样做。 所以现在,我想知道是否有办法在我的代码(例如列表)中访问某些变量集的当前值,因为脚本正在运行? (我当然可以停止它并将更改/打印添加到代码然后重新启动,但由于它现在已经运行了一天,所以到目前为止丢失计算值是很可惜的)

或者,我可以以某种方式崩溃它(除了通常的Ctrl-c键盘中断),以便崩溃时的变量值被粘贴到某处,因为我在我的脚本中没有计划这个吗? (我正在运行Ubuntu,python 2.7,脚本只是通过'python test.py'从终端运行)

1 个答案:

答案 0 :(得分:6)

如果不编辑你的程序,你将会遇到糟糕的时间。您正在寻找的是某种形式的远程调试器,但任何能够为您提供特定于python的东西都可能必须至少以某种方式为您的程序提供一个钩子。话虽这么说,如果你想在堆栈中摆弄,你可以将gdb附加到你的程序(gdb -p <PID>),看看你能找到什么。

编辑:好吧。实际上这可能是可能的。

here之后,安装了GDB的python扩展,如果你弹出一个带有gdb python <PID>的gdb shell,你应该可以运行py-print <name of the variable>来获取它的值,假设它是在那个程序的范围内。 尝试用自己的琐碎程序自己做这件事

import time
a = 10
time.sleep(1000)

我能够通过找到程序的PID(ps aux | grep python),运行sudo gdb python <PID>然后运行py-print a来打开GDB shell,这会生成“global'a'= 10 ”。当然,这假设您在* nix环境中运行。

在GDB shell中徘徊了一段时间,我发现你实际上可以与Python灵长类动物进行交互。例如,要获取数组的长度:

(gdb) python-interative
>>>  frame = Frame.get_selected_python_frame()
>>>  pyop_frame = frame.get_pyop()
>>>  var, scope = pyop_frame.get_var_by_name('<variable name>')
>>>  print(var.field('ob_size'))

请注意要求使用实际的内部字段名称来获取内容(列表的实际值可以使用'ob_item'找到,然后是索引)。

您可以以类似的方式将数组转储到文件中:

length = int(str(var.field('ob_size'))
output = []
for i in range(length):
    output.append(str(var[i]))
with open('dump', 'w') as f:
    f.write(', '.join(output))