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

6g8kf2rb  于 2022-11-08  发布在  PyCharm
关注(0)|答案(9)|浏览(209)

我使用PyCharm IDE进行Python编程。
当我运行程序时,是否有可能检查我是否处于调试模式?
我使用pyplot作为plt,并希望一个图只显示如果我调试我的程序。是的,我可以有一个全局布尔值_debug_这是由我自己设置的,但我寻找一个更好的解决方案。

rt4zxlrg

rt4zxlrg1#

根据文档,可以使用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
esyap4oy

esyap4oy2#

以下代码在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
af7jpaap

af7jpaap3#

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
gev0vcfq

gev0vcfq4#

只是想添加几个替代实现。
使用contextlib.抑制:

import sys 
from contextlib import suppress

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

使用Python 3.8之后的“walrus”运算符new:

import sys 

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

7kjnsjlb5#

测试对象:

  • 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.")
vatpfxk5

vatpfxk56#

在Python 3.9的支持下,在Pycharm 2021.1.3中实现。
简单使用

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()
j2datikz

j2datikz7#

我不使用pycharm,但是要检查程序是否正在使用python -mpdb myFile.py进行调试,下面的代码可以工作:

import sys
if 'pdb' in sys.modules:
    print("I'm being debugged")

只要你不这样做就行了。

gpfsuwkq

gpfsuwkq8#

添加这三个简短的答案,因为它似乎其他人是相当长或更少的点。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()
ltskdhd1

ltskdhd19#

如果使用Python logging module,则可以调用:

logging.root.isEnabledFor(logging.DEBUG)

用于检查根日志记录级别是否为调试。
就这么简单。

相关问题