我在我的开发环境中开始了一个相当雄心勃勃的项目,因为我想我喜欢保持最新状态。所以多年来我一直在使用 Eclipse 和 PyDev 开发一个 Django 项目,它运行良好。
我一直在使用 Python 3.7、Django 2.1 和 Eclipse Photon 一段时间。
我已经尝试了一种全新的开始,如下所示移动到最新版本的所有内容:
- 安装了最新的 Eclipse(2019-12 Eclipse IDE for Web and JavaScript Developers(包括 Incubating 组件)
- 将 PyDev 添加到其中(帮助 > 安装新软件,来自http://www.pydev.org/updates)
- 安装 Python 3.8。
- 安装了 Django 3.0.1。
- 将我的项目依赖的所有包安装到我的本地 3.8 站点包中
- 在一个新的工作区中,我导入了我的旧项目(File > Import > General > Existing Projects into Workspace,选中
Copy projects into workspace - 使用 Python 3.8 解释器创建了一个调试配置,并且(由于某种原因,默认的 sys.path 将我的本地站点包放在 python 3 dist-packages 之后)我将站点包添加到我的外部库并强制它到我的顶部系统路径。
- 开始调试运行...
这工作正常。它开始了,我可以使用我的网站指向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
主要意见:
- 如果我在 settings.py 中设置断点,它会很好地中断。
- 如果我在视图中设置断点,它不会中断。
- 我知道我在正确的文件和位置,因为如果我在要中断的位置添加控制台打印行,它会打印到控制台。所以我没有以任何方式查看错误的源文件。
Fabio 在这里留下了一些非常好的(现在过时的)提示:pydev breakpoints not working,我可以回答这些:
- 如果我把它放在views.py的顶部,我的断点是:
import sys
print('DEBUG: current trace function', sys.gettrace())
我看到这个输出:
DEBUG: current trace function None
这似乎是问题所在。那东西正在关闭调试。
遵循 Fabio 的第一个技巧并考虑自该技巧以来 PyDev 结构的变化,我发现pydevd_constants.py它plugins/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
在那些我很好。
- 该项目被标记为 Django 项目。
- DJANGO_MANAGE_LOCATION 已设置。
- DJANGO_SETTINGS_MODULE 已设置。
我可以在Project Properties > PyDev PYTONPATH > String Substitution Variables上看到后两个。我可以从项目上下文菜单上存在 Django 菜单和缺少Set as Django Project选项来推断第一个。
在这一点上,我希望得到一些进一步的指示。我在这里投入了大量时间进行诊断并试图找出原因,但在这一点上,我的效率将随着一些专业知识和建议的注入而飙升。法比奥?
我在这里问,在很大程度上是因为许多其他人都有,对于面临类似问题的任何人来说,它都是一个非常有用且易于查找的资源。并且没有理由相信不可能的情况。所以我想解决这个问题,并且基本上为了我和其他人的缘故发布了一个解决方案。