我正在Windows 10上使用PyCharm(3.5)调试Python(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)程序。

问题:在某些断点处停止时,“调试器”窗口停留在“收集数据”中,最终导致超时。 (无法显示框架变量)

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

当我进入有断点的地方的函数时,其数据会正确显示。当我进入堆栈时(到达调用函数时,我退出了该堆栈,并最初希望在其中具有断点)–我再次陷入了“收集数据”超时的问题。

至少自2005年以来,就同一问题提出了许多问题。有些已解决,有些没有。这些修复程序通常是对最新版本(我拥有的)的更新。

为了解决或解决这一系列问题,我是否可以找到一般指导?

编辑:一年后,问题仍然存在,并且在引发错误之后,开发人员/支持人员也没有任何 react 。

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

import threading

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

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

最佳答案

我认为这是由于某些类具有过于冗长的默认方法__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)中已解决,至少对于影响我的情况而言。

09-25 17:24
查看更多