WoJ*_*WoJ 11 python debugging pycharm python-3.x python-3.5
我正在3.5使用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.oWindows 10上的PyCharm()调试Python()程序.
问题:当在某些断点处停止时,调试器窗口停留在"收集数据",最终超时.(无法显示帧变量)
要显示的数据既不特殊,也不特别大.它以某种方式可用于PyCharm,因为所述数据的某些值的条件断点工作正常(程序中断) - 看起来收集它仅用于显示(与操作目的相反)的过程失败.
当我进入我的断点周围的函数时,它的数据显示正确.当我向上移动堆栈(到调用函数,我从那里退出的那个以及我最初想要断点的那个)时 - 我再次陷入"收集数据"超时.
至少自2005年以来,出现了许多同样问题.一些是固定的,一些不是.修复通常是对最新版本的更新(我有).
我是否可以采取一般方向来解决或解决这一系列问题?
编辑:一年后,问题仍然存在,并且在bug被提出之后仍然没有来自开发者/支持者的反应.
编辑2018年4月:看起来问题在2018.1版本中得到解决,下面的代码print在线上设置断点时挂起现在可以工作(我可以看到变量):
import threading
def worker():
a = 3
print('hello')
threading.Thread(target=worker).start()
Run Code Online (Sandbox Code Playgroud)
u_b*_*u_b 25
万一您登陆这里是因为您使用PyTorch(或任何其他深度学习库)并尝试在PyCharm (在我的情况下为 Torch 1.31,PyCharm 2019.2)中进行调试,但速度非常慢:
如linkliu mayuyu指出的那样Gevent compatible在Python Debugger设置中启用。该问题可能是由于调试大型深度学习模型(在我的情况下为 BERT 转换器)引起的,但我对此并不完全确定。
我正在添加这个答案,因为它是 2019 年底,这似乎还没有解决。此外,我认为这影响了许多使用深度学习的工程师,所以我希望我的答案格式会触发他们的 stackoverflow 算法 :-)
注意(2020 年 6 月):
虽然添加Gevent compatible允许您调试 PyTorch 模型,但它会阻止您在 PyCharm 中调试 Flask 应用程序!我的断点不再起作用,我花了一段时间才弄清楚这个标志是它的原因。因此,请确保仅在每个项目的基础上启用它。
小智 21
使用pycharm2018.2调试Web应用程序时遇到相同的问题。
该项目是与SocketIO结合的复杂的Flask Web服务器。
当我在代码中创建调试断点,然后按调试按钮时,它在断点处停止,但未加载变量。它只是收集数据数据。最后,我对调试器设置进行了一些调整,使它可以工作。请参见下图以更改设置:
小智 7
当我尝试运行PyTorch (PyCharm 2019.3) 编写的一些深度学习脚本时,我遇到了同样的问题。
我终于发现问题是我设置num_workers了DataLoader一个很大的值(在我的例子中20)。
所以,在调试模式下,我建议设置num_workers为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')
Run Code Online (Sandbox Code Playgroud)
远非最佳,但已经到手了。
更新:该错误似乎在最新的 PyCharm 版本(2018.1)中得到了解决,至少对于影响我的情况来说是这样。
当我使用 sympy 和旨在计算概率分布的 Python 模块“Lea”处理代码时,我也遇到了这个问题。
我为解决超时问题而采取的措施是将调试设置中的“变量加载策略”从默认的“异步”更改为“同步”。

| 归档时间: |
|
| 查看次数: |
2429 次 |
| 最近记录: |