0

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

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

我已经尝试了一种全新的开始,如下所示移动到最新版本的所有内容:

  1. 安装了最新的 Eclipse(2019-12 Eclipse IDE for Web and JavaScript Developers(包括 Incubating 组件)
  2. 将 PyDev 添加到其中(帮助 > 安装新软件,来自http://www.pydev.org/updates
  3. 安装 Python 3.8。
  4. 安装了 Django 3.0.1。
  5. 将我的项目依赖的所有包安装到我的本地 3.8 站点包中
  6. 在一个新的工作区中,我导入了我的旧项目(File > Import > General > Existing Projects into Workspace,选中Copy projects into workspace
  7. 使用 Python 3.8 解释器创建了一个调试配置,并且(由于某种原因,默认的 sys.path 将我的本地站点包放在 python 3 dist-packages 之后)我将站点包添加到我的外部库并强制它到我的顶部系统路径。
  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. 我知道我在正确的文件和位置,因为如果我在要中断的位置添加控制台打印行,它会打印到控制台。所以我没有以任何方式查看错误的源文件。

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

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

我看到这个输出:

DEBUG: current trace function None

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

遵循 Fabio 的第一个技巧并考虑自该技巧以来 PyDev 结构的变化,我发现pydevd_constants.pyplugins/org.python.pydev.core_7.4.0.201910251334/pysrc/_pydevd_bundle可以设置:

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选项来推断第一个。

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

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

4

2 回答 2

1

需要检查的一些事项:

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

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

  3. 如果您使用 启动--noreload,它有效吗?

于 2019-12-27T16:53:15.017 回答
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 都可以解决问题!

于 2020-01-10T22:18:16.940 回答