我已经启动了一个需要很长时间才能完成的python脚本,而且很傻我忘了在我的脚本中不时打印出重要变量的值,例如估计计算的进度我是这样做。 所以现在,我想知道是否有办法在我的代码(例如列表)中访问某些变量集的当前值,因为脚本正在运行? (我当然可以停止它并将更改/打印添加到代码然后重新启动,但由于它现在已经运行了一天,所以到目前为止丢失计算值是很可惜的)
或者,我可以以某种方式崩溃它(除了通常的Ctrl-c键盘中断),以便崩溃时的变量值被粘贴到某处,因为我在我的脚本中没有计划这个吗? (我正在运行Ubuntu,python 2.7,脚本只是通过'python test.py'从终端运行)
答案 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))