【问题标题】:Debugger times out at "Collecting data..."调试器在“正在收集数据...”处超时
【发布时间】:2017-01-15 05:59:15
【问题描述】:

我正在 Windows 10 上使用 PyCharm (PyCharm Community Edition 2016.2.2 ; Build #PC-162.1812.1, built on August 16, 2016 ; JRE: 1.8.0_76-release-b216 x86 ; JVM: OpenJDK Server VM by JetBrains s.r.o) 调试 Python (3.5) 程序。

问题:当在某些断点处停止时,调试器窗口卡在“正在收集数据”,最终超时。无法显示帧变量

要显示的数据既不特殊,也不特别大。它以某种方式可用于 PyCharm,因为所述数据的某些值上的条件断点工作正常(程序中断) - 看起来收集它的过程仅用于显示(而不是操作目的)失败。

当我在有断点的地方进入一个函数时,它的数据会正确显示。当我上堆栈(到调用函数,我从中退出的那个以及我最初希望有断点的地方)时 - 我再次陷入“收集数据”超时。

至少自 2005 年以来,就同一点提出了许多问题。有些已修复,有些未修复。修复通常是更新到最新版本(我有)。

我是否有一个总体方向可以解决或解决这一系列问题?


编辑:一年后问题仍然存在,并且在提出错误后开发人员/支持人员仍然没有任何反应。


编辑 2018 年 4 月:看起来问题在 2018.1 版本中已解决,以下代码在 print 行上设置断点时挂起现在可以工作(我可以看到变量):

import threading

def worker():
    a = 3
    print('hello')

threading.Thread(target=worker).start()

【问题讨论】:

  • 我遇到了完全相同的问题。您找到解决方案或至少找到解释了吗?
  • 很遗憾没有。我向开发人员开了一张票,但反应为零(与另一个问题的另一张票相同)。虽然产品很棒,但支持并不存在。
  • 我在 Keras 中拟合 LSTM 网络,当我尝试从调试器控制台执行“model.predict”时,我得到了这个废话。当我对前馈网络做同样的事情时,它并没有发生。当不在调试器/控制台中时,代码实际上运行得很好。奇怪又烦人。
  • 我在调试大对象时也遇到了这个问题。还是没有解决办法吗?
  • 我在调试单独的进程时得到了同样的结果

标签: python python-3.x debugging pycharm python-3.5


【解决方案1】:

我认为这是由于某些类的默认方法 __str__() 过于冗长。 Pycharm在遇到断点的时候调用这个方法来显示局部变量,在加载字符串的时候就卡住了。 我用来克服这个问题的一个技巧是手动编辑导致错误的类,并将 __str__() 方法替换为不那么冗长的方法。

例如,它发生在 pytorch _TensorBase 类(以及所有扩展它的张量类)中,可以通过编辑 pytorch 源 torch/tensor.py 来解决,将 __str__() 方法更改为:

def __str__(self):
        # All strings are unicode in Python 3, while we have to encode unicode
        # strings in Python2. If we can't, let python decide the best
        # characters to replace unicode characters with.
        return str() + ' Use .numpy() to print'
        #if sys.version_info > (3,):
        #    return _tensor_str._str(self)
        #else:
        #    if hasattr(sys.stdout, 'encoding'):
        #        return _tensor_str._str(self).encode(
        #            sys.stdout.encoding or 'UTF-8', 'replace')
        #    else:
        #        return _tensor_str._str(self).encode('UTF-8', 'replace')

远未达到最佳状态,但已经掌握。

更新:该错误似乎在上一个 PyCharm 版本 (2018.1) 中已解决,至少对于影响我的情况而言。

【讨论】:

  • 这是很好的信息,但就我而言,挂起的是我自己的代码(也没有类)。这主要发生在调试多进程程序时。
  • 感谢您的提醒。我用一个线程代码检查了这个,确实,问题似乎已经消失了(我在我的问题的编辑中添加了一个示例代码)
【解决方案2】:

当我使用 pycharm2018.2 调试我的 Web 应用程序时,我遇到了同样的问题。

该项目是一个与 SocketIO 相结合的复杂烧瓶 Web 服务器。

当我在代码中创建一个调试断点然后按下调试按钮时,它在断点处停止,但变量没有加载。它只是收集数据数据。最后我对调试器设置进行了一些调整,这使它工作。如需更改设置,请参见下图:

【讨论】:

  • 如果您使用的是 Gevent,这确实可以解决问题!
  • 我正在使用 PyCharm 2019.2 和 PyTorch(一个 DL 框架),它有非常大的(张量)对象并且遇到了同样的问题。我一直在绞尽脑汁浪费时间,非常感谢这个解决方案(启用“Gevent compatible”修复了调试器挂起)!
  • 调试 PyTorch 代码时出现同样的问题 - 这应该是正确的答案!
  • 太棒了...这是一个如此大的问题,以至于我准备放弃 Pycharm 以支持 VS Code。
  • 伙计们,与其说谢谢,不如给第一个点赞。这一切都意味着同样的事情,而且杂乱无章:)
【解决方案3】:

当我使用 sympy 和旨在计算概率分布的 Python 模块“Lea”编写代码时,我也遇到了这个问题。

我为解决超时问题而采取的措施是将调试设置中的“变量加载策略”从默认的“异步”更改为“同步”。

【讨论】:

  • 谢谢!这就是我一直在寻找的。​​span>
  • 就我而言,我需要将其设置为On demand 来解决问题。我有许多带有不同大熊猫数据帧的变量,每个变量可能需要 10 秒才能在调试器中呈现。有时,调试器会尝试渲染许多变量,并在此过程中卡住了近乎永恒。
  • 谢谢,这解决了我的问题!
【解决方案4】:

如果您因为使用 PyTorch(或任何其他 深度学习 库)而来到这里并尝试在 PyCharm(torch 1.31,在我的情况下是 PyCharm 2019.2),但它超级慢:

linkliu mayuyu 所指出的,在 Python Debugger 设置中启用 Gevent compatible。该问题可能是由于调试大型深度学习模型(在我的情况下为 BERT 转换器)引起的,但我对此并不完全确定。

我添加了这个答案,因为它是 2019 年底,这似乎还没有解决。此外,我认为这正在影响许多使用深度学习的工程师,所以我希望我的答案格式能够触发他们的 stackoverflow 算法:-)

注意(2020 年 6 月): 虽然添加 Gevent compatible 允许您调试 PyTorch 模型,但它会阻止您在 PyCharm 中调试 Flask 应用程序!我的断点不再起作用,我花了一段时间才弄清楚这个标志是它的原因。因此,请确保仅在每个项目的基础上启用它。

【讨论】:

  • 对 gensim 也有帮助。谢谢
【解决方案5】:

当我尝试运行由 PyTorch (PyCharm 2019.3) 编写的一些深度学习脚本时遇到了同样的问题。

我终于发现问题在于我将DataLoader 中的num_workers 设置为一个很大的值(在我的情况下为20)。

所以,在调试模式下,我建议将num_workers 设置为1

【讨论】:

  • num_workers1 设置为0 在这里为我工作。我猜,调试线程不知何故无法访问工人上正在运行的线程。
【解决方案6】:

对我来说,解决方案是每次在开始调试之前移除手动手表。如果“变量”窗口中有任何现有的手动手表,那么它将停留在“正在收集数据...”中。

【讨论】:

    【解决方案7】:

    使用 Odoo 或其他大型 Python 服务器

    尽管我尝试了所有方法,但上述解决方案都不适合我。 它通常可以工作,但偶尔会出现这种烦人的Collecting data... 或有时Timed Out...

    解决办法是重启Pycharm,尽量少设置断点。之后它又开始工作了。

    我不知道这样做的方法(可能断点太多)但它有效。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多