检查程序是否在调试模式下运行

问题描述 投票:0回答:10

我使用 PyCharm IDE 进行 Python 编程。

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

我使用 pyplot 作为 plt,并且希望仅在调试程序时显示图形。是的,我可以有一个由我自己设置的全局布尔值

_debug_
,但我正在寻找更好的解决方案。

python python-2.7 debugging pycharm
10个回答
49
投票

根据文档,可以使用

settrace
/
gettrace
函数来实现 Python 调试器:

sys.settrace(tracefunc) 

设置系统的trace功能,可以 您可以在 Python 中实现 Python 源代码调试器。功能 是线程特定的;对于支持多线程的调试器,它 必须使用

settrace()
为每个正在调试的线程进行注册。

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

CPython 实现细节

settrace()
函数的目的是 仅用于实现调试器、分析器、覆盖工具和 喜欢。它的行为是实现平台的一部分,而不是 语言定义的一部分,因此可能不适用于所有语言 Python 实现。

您可以使用以下代码片段来检查是否有人正在调试您的代码:

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

22
投票

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

import sys 

def debugger_is_active() -> bool:
    """Return if the debugger is currently active"""
    return hasattr(sys, 'gettrace') and sys.gettrace() is not None

6
投票

测试于

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

2
投票

只是想添加几个替代实现。

使用contextlib.suppress

import sys 
from contextlib import suppress

def is_debugging() -> bool:
    with suppress(AttributeError):
        return sys.gettrace()

使用 Python 3.8 以来新增的 “walrus”运算符:

import sys def is_debugging() -> bool: return (gettrace := getattr(sys, 'gettrace')) and gettrace()
    

1
投票
添加这三个简短的答案,因为其他答案似乎相当长或不太切题。 gettrace() 已经是一个函数了,所以不需要再写一个......

其中任何一个都可以(例如)用于设置日志记录模块记录器级别。

(在 Py3.9 中使用 VSCode 和 PyCharm 与本发布日期同时进行测试)

from sys import gettrace if gettrace(): print("Debug") else: print("Run")
或者如果你需要一个变量

import sys DEBUG = sys.gettrace() is not None
 或全局 - 这不是一个好主意,因为您可能会在大型项目中冒命名空间冲突的风险。

import sys sys.modules['GLOB_DEBUG'] = sys.gettrace()
    

0
投票
测试:

    PyCharm
  • 2020.2
    (以及之前的许多版本)
  • Python
  • 3.7.5
    (以及之前的许多版本)
  • Windows 10 x64
    
    
PyCharm 中有两种调试方式:

    方法#1:
  • Selection-Based Debug Mode
    :菜单
    [ View > Tool Windows > 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.")
    

0
投票
在 Pycharm 2021.1.3 和 Python 3.9 中。

简单使用

sys.gettrace()
下面,调试心情将显示打印的“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()
    

0
投票
我不使用pycharm,但要检查程序是否正在使用

python -mpdb myFile.py

进行调试,此代码将起作用:

import sys if 'pdb' in sys.modules: print("I'm being debugged")
只要你不这样做

import pdb


0
投票
可能更新

Python 3.12+

PyCharm 2023.3+

import sys def debug_enabled(): try: if sys.gettrace() is not None: return True except AttributeError: pass try: if sys.monitoring.get_tool(sys.monitoring.DEBUGGER_ID) is not None: return True except AttributeError: pass return False
上下文是

PEP 669 – CPython 的低影响监控,并且宣布支持 PyCharm 2023.3 中的该功能。 PEP 669 引入了 sys.monitoring 模块。 PyCharm 可能会使用它来代替 sys.settrace()

。调试按钮确实如此,而 Python Console 仍然使用 
settrace


-1
投票
如果使用Python

logging模块,你可以调用:

logging.root.isEnabledFor(logging.DEBUG)
用于检查根日志记录级别是否为调试。

就这么简单。

© www.soinside.com 2019 - 2024. All rights reserved.