Python Ecplipse、PyDev、Django:settings.py中的断点有效,但视图中的断点无效

Python Ecplipse、PyDev、Django:settings.py中的断点有效,但视图中的断点无效,python,eclipse,debugging,pydev,breakpoints,Python,Eclipse,Debugging,Pydev,Breakpoints,我已经在我的开发环境中开始了一个相当雄心勃勃的项目,因为我想我喜欢保持最新。因此,我多年来一直在使用Eclipse和PyDev进行Django项目,它工作得非常出色 我使用Python3.7、Django 2.1和Eclipse光子已经有一段时间了 我尝试了一种全新的开始,如下所示,移动到最新版本的所有内容: 已安装最新的Eclipse(2019-12面向Web和JavaScript开发人员的Eclipse IDE(包括孵化组件) 向其中添加PyDev(帮助>安装新软件,从) 已安装Python

我已经在我的开发环境中开始了一个相当雄心勃勃的项目,因为我想我喜欢保持最新。因此,我多年来一直在使用Eclipse和PyDev进行Django项目,它工作得非常出色

我使用Python3.7、Django 2.1和Eclipse光子已经有一段时间了

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

  • 已安装最新的Eclipse(2019-12面向Web和JavaScript开发人员的Eclipse IDE(包括孵化组件)
  • 向其中添加PyDev(帮助>安装新软件,从)
  • 已安装Python3.8
  • 已安装Django 3.0.1
  • 将我的项目所依赖的所有软件包安装到我的本地3.8站点软件包中
  • 在一个新的工作区中,我导入了我的旧项目(文件导入常规现有项目到工作区,选中了
    将项目复制到工作区
  • 使用Python 3.8解释器创建了一个调试配置(由于某种原因,默认sys.path将本地站点包放在Python 3 dist包之后),我将站点包添加到外部库中,并将其强制放在sys.path的顶部
  • 已开始调试运行
  • 这很好。一开始,我可以用我的网站指向它,而且它大部分都是功能性的,事实上没有什么可抱怨的,几乎预期升级中会有更多的戏剧。不完美有一些调整,使其与Django 3.0.1兼容,但出人意料的少

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

    安装在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中设置断点,它会很好地中断
  • 如果在视图中设置断点,它不会中断
  • 我知道我在正确的文件和位置,因为如果我在我想要中断的位置添加控制台打印行,它会打印到控制台。因此,我不会以任何形式查看错误的源文件
  • 法比奥在这里留下了一些非常好的(现在已经过时)建议:我可以说,作为对这些建议的回应:

  • 如果我将其放在views.py的顶部,其中我需要断点:
  • 我看到这个输出:

    DEBUG: current trace function None
    
    这似乎是问题所在。某些东西正在关闭调试

    遵循Fabio的第一个技巧并考虑到自该技巧以来PyDev结构的变化,我在
    plugins/org.python.PyDev.core_7.4.0.20191025134/pysrc/_PyDev_bundle
    中找到了
    PyDev_constants.py
    ,并在其中设置:

    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文件中,根据法比奥的建议,在干草堆中寻找一根针:

    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.
    
    这是我们迄今为止最好的线索。我怀疑这里有些东西处于一个非常紧密的无休止的循环中。网页仍然在加载,因此它不会以惊人的速度消耗资源,而且它运行了很长时间,不会溢出任何堆栈或任何东西,但显然似乎不知何故被破坏了

    但是要在这里确定一些东西是非常困难的

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

    import pydevd;
    pydevd.settrace()
    
    Alas无法导入pydevd,但如果我向外部库添加:

    ...plugins/org.python.pydev.core_7.4.0.201910251334/pysrc
    
    我可以,然后运行它,但它会在我的控制台上产生无穷无尽的文本流,而我的网站在发生这种情况时不会响应。因此,这是一种蛮力,在调试服务器关闭的意义上;-)。这可能与上面无休止的循环有关

    其他检查:

    我查看了Fabios的需求列表:

    在这些方面我很好

  • 该项目被标记为Django项目
  • DJANGO_管理_位置已设置
  • DJANGO_设置_模块已设置
  • 我可以在项目属性上看到后两个PyDev PYTONPATH字符串替换变量。我可以从项目上下文菜单上的Django菜单以及缺少设置为Django项目的选项中推断出第一个

    在这一点上,我希望能有更多的建议。我在这里投入了大量的时间进行诊断,并试图找出原因,但在这一点上,我的效率将随着一些注入的专业知识和建议而飞速提高。法比奥

    我在这里发问,这在很大程度上是因为很多OTEHR都有,而且对于任何面临类似问题的人来说,它都是一个非常有用的、可查找的资源。考虑到目前的情况,没有理由相信这是不可能的。所以我希望这个问题得到解决,并且发布一个基本上是为了我和其他人的原因的解决方案。

    有些事情需要检查:

  • 它们是否在两个不同的进程中?例如:如果在设置和视图中导入操作系统;打印(os.getpid()),它是否是相同的pid?(我怀疑您看到的是进行自动加载的主进程的日志,而不是实际执行代码的辅助进程的日志)

  • PyDev中是否打开了附加到子流程的设置?(即:
    首选项>PyDev>调试>调试时自动附加到子流程

  • import pydevd; pydevd.settrace()
    ...plugins/org.python.pydev.core_7.4.0.201910251334/pysrc