【问题标题】:Check if program runs in Debug mode检查程序是否在调试模式下运行
【发布时间】:2016-12-02 18:20:47
【问题描述】:

我使用 PyCharm IDE 进行 Python 编程。

是否有可能在我运行程序时检查我是否处于调试模式?

我使用 pyplot 作为 plt,并且只希望在调试程序时显示一个 Figure。是的,我可以有一个由我自己设置的全局布尔值_debug_,但我正在寻找更好的解决方案。

【问题讨论】:

    标签: python python-2.7 debugging pycharm


    【解决方案1】:

    根据文档,settrace / gettrace 函数可用于实现 Python 调试器:

    sys.settrace(tracefunc) 
    

    设置系统的trace功能,允许 您可以在 Python 中实现 Python 源代码调试器。功能 是线程特定的;对于支持多线程的调试器,它 必须使用 settrace() 为每个正在调试的线程注册。

    但是,这些方法可能并非在所有实现中都可用:

    CPython 实现细节settrace() 函数旨在 仅用于实现调试器、分析器、覆盖工具和 喜欢。它的行为是实现平台的一部分,而不是 语言定义的一部分,因此可能并非全部可用 Python 实现。

    您可以使用以下 sn-p 来检查是否有人在调试您的代码:

    import sys
    
    
    gettrace = getattr(sys, 'gettrace', None)
    
    if gettrace is None:
        print('No sys.gettrace')
    elif gettrace():
        print('Hmm, Big Debugger is watching me')
    else:
        print("Let's do something interesting")
        print(1 / 0)
    

    这个适用于 pdb:

    $ python -m pdb main.py 
    > /home/soon/Src/Python/main/main.py(3)<module>()
    -> import sys
    (Pdb) step
    > /home/soon/Src/Python/main/main.py(6)<module>()
    -> gettrace = getattr(sys, 'gettrace', None)
    (Pdb) step
    > /home/soon/Src/Python/main/main.py(8)<module>()
    -> if gettrace is None:
    (Pdb) step
    > /home/soon/Src/Python/main/main.py(10)<module>()
    -> elif gettrace():
    (Pdb) step
    > /home/soon/Src/Python/main/main.py(11)<module>()
    -> print('Hmm, Big Debugger is watching me')
    (Pdb) step
    Hmm, Big Debugger is watching me
    --Return--
    > /home/soon/Src/Python/main/main.py(11)<module>()->None
    -> print('Hmm, Big Debugger is watching me')
    

    还有 PyCharm:

    /usr/bin/python3 /opt/pycharm-professional/helpers/pydev/pydevd.py --multiproc --qt-support --client 127.0.0.1 --port 34192 --file /home/soon/Src/Python/main/main.py
    pydev debugger: process 17250 is connecting
    
    Connected to pydev debugger (build 143.1559)
    Hmm, Big Debugger is watching me
    
    Process finished with exit code 0
    

    【讨论】:

    • 这也适用于 VS Code v1.61.2 调试,包括堆叠调试会话(返回相同的跟踪对象)。
    • Pycharm 中也有这项工作
    • 在调试器中点击继续时似乎不起作用,这是为什么?
    • 为什么还要除以0?对应什么情况?这就是我点击继续时发生的事情。
    • 请说明你是如何运行你的脚本的,什么python版本和你使用什么调试器。我刚刚检查了 Mac (pdb) 上的 Python 3.9.5 - 工作得很好。至于1 / 0 - 这是脚本无法确定调试器的情况。
    【解决方案2】:

    以下内容在 VSCode 中对我有用:

    import sys 
    
    def debugger_is_active() -> bool:
        """Return if the debugger is currently active"""
        gettrace = getattr(sys, 'gettrace', lambda : None) 
        return gettrace() is not None
    

    【讨论】:

    • 我喜欢lambda: None 选项。这总是将结果转换为函数,因此您可以根据需要立即解决它:trace_object = getattr(sys, 'gettrace', lambda: None)()。结果将是跟踪对象或None
    【解决方案3】:

    测试:

    • PyCharm 2020.2(以及之前的许多版本)
    • Python 3.7.5(以及之前的许多版本)
    • Windows 10 x64

    PyCharm中有两种调试方式:

    • 方法#1:Selection-Based Debug Mode:菜单[ View &gt; Tool Windows &gt; Python Console ],然后选择一行,右击然后Execute Selection in Python Console
    • 方法#2:Standard Debug Mode:使用工具栏下拉菜单中的Edit Configuration创建新配置,可以使用断点、变量监视等进行调试。

    下面的函数检测方法#1(上面),因为它总是在命令行中传入--port=XXXX

    C:\python\python.exe "C:\Program Files\JetBrains\PyCharm Professional Edition with Anaconda plugin 2020.1.1\plugins\python\helpers\pydev\pydevconsole.py" --mode=client --port=53093
    

    功能:

    import sys
    
    def is_debug_pycharm_by_select():
        """
        Detect if running in Selection-Based Debug Mode under PyCharm:
          -  PyCharm menu [ View > Tool Windows > Python Console ], highlight Python line in editor, right click "Execute Selection in Python Console".
        :return: True if executing selection in Python Console.
        """
        for arg in sys.argv:
            if "--port=" in arg:  # This debug mode passes in "--port=XXXX".
                return True
        return False
    
    if is_debug_pycharm_by_select():
        print("Selection-Based Debug Mode.")
    else:
        print("Some other debug mode.")
    
    

    【讨论】:

    • 这似乎比使用gettrace 的其他解决方案更老套和逊色。有什么理由想要这个而不是gettrace
    【解决方案4】:

    在 Pycharm 2021.1.3 和 Python 3.9 中。

    简单使用

    sys.gettrace()
    

    下面,debug mood 将显示打印的“Now in debug”,运行将打印 play Mood

    import sys
    gettrace= sys.gettrace()
    
    # For debugging
    debug_status=True if gettrace else False
    
    def xtest_debug():
        if debug_status:
            print('Now in debug')
        else:
            print('Play Mood')
    xtest_debug()
    

    【讨论】:

      【解决方案5】:

      测试于PyCharm 2021.3.2:

      def is_debug():
          import sys
      
          gettrace = getattr(sys, 'gettrace', None)
      
          if gettrace is None:
              return False
          else:
              v = gettrace()
              if v is None:
                  return False
              else:
                  return True
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 2012-05-04
        • 2015-11-26
        • 1970-01-01
        • 2011-06-03
        相关资源
        最近更新 更多