【问题标题】:Ecplipse, PyDev, Django: Breakpoints in settings.py work, but in views do notEclipse、PyDev、Django:settings.py 中的断点有效,但视图中的断点无效
【发布时间】:2019-12-26 02:10:19
【问题描述】:

我在我的开发环境中开始了一个相当雄心勃勃的项目,因为我想我喜欢保持最新状态。所以多年来我一直在使用 Eclipse 和 PyDev 开发一个 Django 项目,它运行良好。

我一直在使用 Python 3.7、Django 2.1 和 Eclipse Photon。

我尝试了一种全新的开始方式,如下所示,将所有内容移至最新版本:

  1. 安装了最新的 Eclipse(2019-12 Eclipse IDE for Web and JavaScript Developers(包括孵化组件)
  2. 将 PyDev 添加到其中(帮助 > 安装新软件,来自 http://www.pydev.org/updates
  3. 已安装 Python 3.8。
  4. 已安装 Django 3.0.1。
  5. 将我的项目依赖的所有包安装到我的本地 3.8 站点包中
  6. 在新工作区中,我导入了旧项目(文件 > 导入 > 常规 > 现有项目到工作区,检查Copy projects into workspace
  7. 使用 Python 3.8 解释器创建了一个调试配置,并且(由于某种原因,默认的 sys.path 将我的本地站点包放在 python 3 dist-packages 之后)我将站点包添加到我的外部库并强制它我的 sys.path 的顶部。
  8. 开始调试运行...

这很好用。它开始了,我可以使用我的网站指向http://127.0.0.1:8000/,它主要是功能性的,实际上不能抱怨,几乎可以期待更多的升级。 Not perfect 做了一些调整以使其与 Django 3.0.1 兼容,但令人惊讶的是很少。

我被困在崩溃的页面上,所以我设置了一个断点,却发现它不起作用......嗯。我以前和 PyDev 一起来过这里,还有很多其他的。所以我已经进行了基本的诊断,并将分享我所知道的。但如果有人(尤其是法比奥)能提供更多的智慧来帮助他们工作,我将不胜感激。

安装在 Eclipse 上的是:

  PyDev for Eclipse 7.4.0.201910251334  org.python.pydev.feature.feature.group  Fabio Zadrozny
  PyDev for Eclipse Developer Resources 7.4.0.201910251334  org.python.pydev.feature.source.feature.group   Fabio Zadrozny
  Pydev Mylyn Integration   0.6.0   org.python.pydev.mylyn.feature.feature.group    Fabio Zadrozny

关键观察:

  1. 如果我在 settings.py 中设置断点,它会正常中断。
  2. 如果我在视图中设置断点,它不会中断。
  3. 我知道我在正确的文件和位置,因为如果我在要中断的位置添加控制台打印行,它会打印到控制台。所以我没有以任何方式查看错误的源文件。

法比奥在这里留下了一些非常好的(现在过时的)提示:pydev breakpoints not working 我可以回应这些提示:

  1. 如果我把它放在views.py 的顶部,我的断点是:
import sys
print('DEBUG: current trace function', sys.gettrace())

我看到了这个输出:

DEBUG: current trace function None

这似乎是问题所在。那东西正在关闭调试。

按照 Fabio 的第一个技巧并考虑自该技巧以来 PyDev 结构的变化,我在 plugins/org.python.pydev.core_7.4.0.201910251334/pysrc/_pydevd_bundle 中找到了 pydevd_constants.py 并可以在其中设置:

DEBUG_TRACE_LEVEL = 3 
DEBUG_TRACE_BREAKPOINTS = 3

正如法比奥建议的那样。这揭示了一点遗憾。从本质上讲,当开始调试运行直到服务器运行时,我会看到很多很酷的跟踪。然后我看到标准输出显示服务器正在运行:

System check identified no issues (0 silenced).
December 26, 2019 - 12:29:54
Django version 3.0.1, using settings 'MyProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

它在 settings.py 中的断点处停了下来,我继续按 F8。

现在在我的浏览器中加载我正在调试的视图。并且控制台上的 PyDev 跟踪为零,事实上,我只得到了我的小打印行,我将其放入视图的 get_queryset() 方法中,以确保我的代码(带有断点)正在运行。

所以这没有任何帮助。我可以在我的 views.py 文件中根据 Fabio 的建议在大海捞针中寻找针:

import sys
print('DEBUG: current trace function', sys.gettrace())
def trace_func(frame, event, arg):
    with open('pydev-trace.txt', 'a') as f:
        print('Context: ', frame.f_code.co_name, '\tFile:', frame.f_code.co_filename, '\tLine:', frame.f_lineno, '\tEvent:', event, file=f)
    return trace_func

sys.settrace(trace_func)
print('DEBUG: current trace function', sys.gettrace())

我现在在控制台上看到:

DEBUG: current trace function None
DEBUG: current trace function <function trace_func at 0x7ffaa6f18b80>
System check identified no issues (0 silenced).
December 26, 2019 - 12:42:48
Django version 3.0.1, using settings 'MyProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

哪种好看。

但输出跟踪似乎永远不会停止。它不断增长,不断增长,似乎陷入了自动重新加载的循环中,无休止地循环:

Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 370   Event: call
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 361   Event: line
Context:  watched_files     File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 260   Event: call
Context:  watched_files     File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 260   Event: return
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 362   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 758   Event: call
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 759   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: return
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 364   Event: line
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 365   Event: line
Context:  stat  File: /usr/lib/python3.8/pathlib.py     Line: 1186  Event: call
Context:  stat  File: /usr/lib/python3.8/pathlib.py     Line: 1191  Event: line
Context:  __fspath__    File: /usr/lib/python3.8/pathlib.py     Line: 721   Event: call
Context:  __fspath__    File: /usr/lib/python3.8/pathlib.py     Line: 722   Event: line
Context:  __str__   File: /usr/lib/python3.8/pathlib.py     Line: 711   Event: call
Context:  __str__   File: /usr/lib/python3.8/pathlib.py     Line: 714   Event: line
Context:  __str__   File: /usr/lib/python3.8/pathlib.py     Line: 715   Event: line
Context:  __str__   File: /usr/lib/python3.8/pathlib.py     Line: 715   Event: return
Context:  __fspath__    File: /usr/lib/python3.8/pathlib.py     Line: 722   Event: return
Context:  stat  File: /usr/lib/python3.8/pathlib.py     Line: 1191  Event: return
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 369   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 758   Event: call
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 759   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: return
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 370   Event: line
Context:  snapshot_files    File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 370   Event: return
Context:  tick  File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 346   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 758   Event: call
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 759   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: return
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 753   Event: call
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 754   Event: line
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 756   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 744   Event: call
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 747   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: return
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 744   Event: call
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 747   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: return
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 756   Event: return
Context:  tick  File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 347   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 758   Event: call
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 759   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: line
Context:  __hash__  File: /usr/lib/python3.8/pathlib.py     Line: 760   Event: return
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 753   Event: call
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 754   Event: line
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 756   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 744   Event: call
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 747   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: return
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 744   Event: call
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 747   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: line
Context:  _cparts   File: /usr/lib/python3.8/pathlib.py     Line: 748   Event: return
Context:  __eq__    File: /usr/lib/python3.8/pathlib.py     Line: 756   Event: return
Context:  tick  File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 348   Event: line
Context:  tick  File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 351   Event: line
Context:  tick  File: /home/me/.local/lib/python3.8/site-packages/django/utils/autoreload.py    Line: 345   Event: line

这是我们迄今为止最好的线索。我怀疑这里的某些东西处于一个非常紧密的无休止的循环中。网页仍在加载,因此它不会以极快的速度耗尽资源,并且它运行了很长时间并且不会溢出任何堆栈或任何东西,但显然似乎以某种方式损坏了。

但是在这里确定一些东西变得非常困难。

最后,法比奥在回复中建议暴力修复可能是:

import pydevd;
pydevd.settrace()

唉,无法导入 pydevd,但如果我添加到我的外部库:

...plugins/org.python.pydev.core_7.4.0.201910251334/pysrc

我可以,然后运行它,但它会在我的控制台上产生无穷无尽的文本流,而我的网站在这种情况发生时不会响应。因此,从调试服务器关闭的角度来看,这是蛮力;-)。这可能与上面的无限循环有关。

其他检查:

我查看了 Fabios 的需求列表:

http://www.pydev.org/manual_adv_django.html

在那些我很好。

  1. 该项目被标记为 Django 项目。
  2. DJANGO_MANAGE_LOCATION 已设置。
  3. DJANGO_SETTINGS_MODULE 已设置。

我可以在 Project Properties > PyDev PYTONPATH > String Substitution Variables 上看到后两者。我可以从项目上下文菜单上存在 Django 菜单和缺少 Set as Django Project 选项来推断第一个。

在这一点上,我希望得到一些进一步的指示。我在这里投入了大量时间进行诊断并试图找出原因,但在这一点上,我的效率将随着一些专业知识和建议的加入而飙升。法比奥?

我在这里问,很大程度上是因为许多其他人都有,对于面临类似问题的任何人来说,它都是一个非常有用且易于查找的资源。并且没有理由相信不可能的情况。所以我想解决这个问题,并且基本上为了我和其他人的利益发布了一个解决方案。

【问题讨论】:

    标签: python eclipse debugging pydev breakpoints


    【解决方案1】:

    需要检查的一些事项:

    1. 它们是否在 2 个不同的进程中?即:如果你在设置和视图中import os;print(os.getpid()),它是同一个pid吗? (我怀疑您看到的是进行自动重载的主进程的日志,而不是实际执行代码的辅助进程的日志)。

    2. 是否在 PyDev 中打开了附加到子进程的设置? (即:preferences &gt; pydev &gt; debug &gt; attach to subprocess automatically while debugging)。

    3. 如果您使用--noreload 进行发布,是否有效?

    【讨论】:

    • 我会尽快检查流程(直到周一或周二)。同时(我的钱花在两个进程上)只是为了澄清一下, --noreload 选项是调试配置中 runserver 的命令行参数吗?
    • 1) 我确实有两个不同的进程,每个进程都加载设置文件,但断点只在第一个进程中停止。但我可以注意到,据我所知,多年来我一直想知道为什么我的设置文件中的打印在每次调试运行时都会出现两次。但它过去一直与两个进程一起工作。 2)我设置了该选项(即附加到子进程)。确实。总是有而且仍然有。 3)如果我在我的调试配置中添加 --noreload 选项到 runserver 我注意到我只有一个进程并且我的视图中的断点再次工作。
    • 令我困惑的是,当我在调试配置中使用runserver --noreload 时,对文件的编辑似乎仍然会导致重新加载。至少它上线了,也许这不是重新加载的意思?由此引发了许多问题:1)为什么附加到子流程的选项在这个新环境中停止工作? 2) 为什么调试运行会产生两个进程? 3) 为什么,当使用--noreload 时,对.py 视图的更改仍然生效?
    • Django 有一个自动重载,它会生成一个不同的进程,并且在文件更改时它会终止进程并重新启动它,但是 pydev 调试器也有一个内置的 reload 可以进行实时重载(即你所看到的——它不是 100% 可靠的,但涵盖了很多情况)。我仍然不确定为什么它不跟踪...您可以创建相同的跟踪配置文件但将进程 ID 添加到文件中以了解子进程中可能发生的情况吗?
    • 即:在with open('pydev-trace.txt', 'a') as f: 做:with open('pydev-trace_%s.txt' % (os.getpid(),), 'a') as f:
    【解决方案2】:

    2020 年 1 月 10 日发布的 PyDev 版本 7.5.0 修复了此问题。我的观点中的断点再次正常运行。我的发行说明包括:

    • 修复了对 Python 3.8 的支持(未正确添加到 7.4.0)。
    • 调试器改进(更新到 pydevd 1.9.0)。
      • 改进了进入协程
      • 附加到进程不再需要将目标程序的位数与解释器匹配。
      • 在 sys.path 文件夹中搜索具有相对路径的文件(即:因此,cython 构建可以找到源)。

    让我怀疑与 Python 3.8 相关的整个问题(考虑到 Python 3.8 的最新版本,这不足为奇)尽管 pydevd 1.9.0 中的调整可能起到了作用。无论哪种方式,PyDev 更新到 7.5.0 都可以解决问题!

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多