Ecplipse,PyDev,Django:settings.py中的断点有效,但视图中的断点不起作用

时间:2019-12-26 02:10:19

标签: python eclipse debugging pydev breakpoints

在我的开发环境中,我进行了一个雄心勃勃的项目,因为我想保持最新状态。因此,我多年来一直在使用Eclipse和PyDev进行Django项目,并且效果很好。

一段时间以来,我一直在使用Python 3.7,Django 2.1和Eclipse Photon。

我尝试了一种全新的尝试,如下所示,逐步升级为最新版本:

  1. 安装了最新的Eclipse(用于Web和JavaScript开发人员的2019-12 Eclipse IDE(包括Incubating组件)
  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-package之后),我将站点包添加到了外部库中,并强制将其添加到了我sys.path的顶部。
  8. 开始调试运行...

这很好。首先,我可以使用指向http://127.0.0.1:8000/的网站进行操作,并且该网站大部分都可以正常运行,实际上不能抱怨,几乎可以预期会有更多戏剧性的升级。为了达到与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. 我知道我在正确的位置,因为如果在要中断的位置添加控制台打印行,则会将其打印到控制台。因此,我不会以任何形式查看错误的源文件。

Fabio在这里留下了一些非常好的(现在是日期)提示:pydev breakpoints not working,我可以回应一下:

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

我看到以下输出:

DEBUG: current trace function None

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

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

DEBUG_TRACE_LEVEL = 3 
DEBUG_TRACE_BREAKPOINTS = 3

如Fabio所建议。这揭示了一点遗憾。从本质上讲,在启动调试运行直到服务器运行之前,我会看到很多不错的跟踪。然后我看到标准输出说服务器正在运行:

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

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

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

最后在回应中,Fabio建议采用暴力破解方法:

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。

我可以在项目属性> PyDev PYTONPATH > 字符串替换变量上看到后两个。我可以从项目上下文菜单中存在Django菜单并缺少设置为Django项目的选项中推断出第一个。

在这一点上,我希望有更多的指导。我在这里花费了大量的时间进行诊断,并试图找出原因,但是在这一点上,我的效率将因注入的专业知识和建议而飞速增长。法比奥?

我在这里问的主要是因为有许多方面,对于遇到类似问题的任何人来说,它都是非常有用的可找到的资源。而且没有理由相信这种情况是不可能的。所以我想解决这个问题,并且基本上出于我和其他人的考虑发布了一个解决方案。

2 个答案:

答案 0 :(得分:0)

一些要检查的东西:

  1. 这两个过程不同吗?即:如果您在设置和视图中import os;print(os.getpid())是相同的pid? (我怀疑您正在看到进行自动重新加载的主进程的日志,而不是在实际执行代码的辅助进程上的日志。)

  2. 要附加到PyDev中的子流程的设置是否打开? (即:preferences > pydev > debug > attach to subprocess automatically while debugging)。

  3. 如果您使用--noreload进行启动,是否可以正常工作?

答案 1 :(得分:0)

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

  • 修复了对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均可解决该问题!

相关问题