【问题标题】:Is there a way to access variables after an error when running Python有没有办法在运行 Python 时出现错误后访问变量
【发布时间】:2015-09-08 15:07:35
【问题描述】:

我正在使用 Pycharm 社区 4.5.4。我正在运行一个需要很长时间才能完成的程序。

不幸的是,我在保存累积数据的行之前有一个打印语句,但该行有错误。我自己跑了打印线,确认这条线会失败。

可能是我在运行程序后进行了更改,所以它不会失败,但我不能确定。这部分代码大约需要 90 小时才能完成,如果执行时间保持在平均水平左右,我还剩下大约 30 小时。

那么,如果失败了,有没有办法恢复数据呢?

为了清楚起见,我正在运行而不是调试。另外,我正在进行线路分析,以了解每 2.5 小时迭代的时间是如何花费的。

【问题讨论】:

  • 如果你已经在控制台中运行了这个,你可以使用pdb.pm() 来进入失败的上下文(不要忘记import pdb首先 - 当我忘记时总是很烦人,现在是最后一个错误是它不知道 pdb 是什么 :) 并查看内容、保存等。或者(我不知道 pycharm)你可以在那里放置一个断点。但是,如果您单独运行它,那就没有办法了。
  • 您可以在主进程中使用stackoverflow.com/questions/242485/…。并使用jetbrains.com/pycharm/help/attaching-to-process.html 附加到主进程。
  • 你是不是也跟程序一起写日志文件?
  • @AliSAIDOMAR 我能够使用“附加到进程...”,然后使用“评估代码片段”(Alt+F8)导入其他模块(Pickle)并转储值我设置的断点处的变量。您会提交您的评论作为答案,以便我给您信用吗?非常感谢。

标签: python runtime-error pycharm


【解决方案1】:

所以我告诉过,你应该更新你的主模块以在断点处退出

import pdb
import random
import time
import os
import traceback
import sys


def main(*args, **kw):
    for i in range(10):
        print("OK I'm in %d" % os.getpid())
        time.sleep(4)
        if i == 9:
            raise Exception

if __name__ == '__main__':
    try:
        main()
    except:
        type, value, tb = sys.exc_info()
        traceback.print_exc()
        pdb.post_mortem(tb)

Starting python debugger automatically on error 信用。

并使用 Pycharm attach 来处理。如果出现错误,那么您将能够使用 pycharm 进行调试。

【讨论】:

  • 我应该在 OP 中补充一点,有问题的程序实际上仍在运行。这种情况很少见,但程序将运行约 90 小时。这意味着我需要闯入当前正在运行的程序并能够访问数据。使用您在上面评论中留下的信息,我能够做到这一点。如果我可以重新开始,您的答案会很好,但重点是避免重新开始和丢失数据。就像我在上面的评论中所说的那样,可以附加到当前正在运行的进程并使用 Run |评估表达式...以导入、保存或其他操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
相关资源
最近更新 更多