代码之家  ›  专栏  ›  技术社区  ›  Stéphane Bonniez

如何检测正在通过调试器执行的python代码?

  •  19
  • Stéphane Bonniez  · 技术社区  · 16 年前

    在python代码中,有没有一种简单的方法可以检测出这个代码是通过python调试器执行的?

    我有一个使用Java代码的小Python应用程序(感谢JPype)。当我调试python部分时,我希望嵌入的jvm也有调试选项。

    8 回复  |  直到 10 年前
        1
  •  18
  •   babbageclunk    16 年前

    python调试器(以及profiler和coverage工具)使用 sys.settrace 功能(在 sys 模块)注册一个回调,当发生有趣的事件时调用该回调。

    如果您使用的是python 2.6,您可以调用 sys.gettrace() 获取当前跟踪回调函数。如果不是 None 然后您可以假设您应该将调试参数传递给JVM。

    现在还不清楚你怎么能做到2.6之前的版本。

        2
  •  10
  •   twasbrillig    10 年前

    使用python 2.4的解决方案(它应该适用于任何高于2.1的版本)和pydev:

    import inspect
    
    def isdebugging():
      for frame in inspect.stack():
        if frame[1].endswith("pydevd.py"):
          return True
      return False
    

    同样的方法也可以简单地替换PDB。 pydevd.py 具有 pdb.py . 正如DO3CC建议的那样,它试图在调用者的堆栈中找到调试器。

    有用链接:

        3
  •  7
  •   Travelling Man    13 年前

    另一种方法取决于如何启动Python解释器。它要求启动python时使用-o进行生产,而不使用-o进行调试。因此,它确实需要一个可能难以维持的外部规则。但同样,它可能完全适合您的流程。

    从python文档(参见“内置常量” here here ):

    __debug__
    This constant is true if Python was not started with an -O option.
    

    使用方法如下:

    if __debug__:
        print 'Python started without optimization'
    
        4
  •  6
  •   jordeu    10 年前

    如果您使用的pydev也可以在多线程中工作,那么另一种选择是:

    try:
        import pydevd
        DEBUGGING = True
    except ImportError:
        DEBUGGING = False
    
        5
  •  5
  •   Mvoicem    13 年前

    如果您正在使用pydev,您可以这样检测它:

    import sys
    if 'pydevd' in sys.modules: 
        print "Debugger"
    else:
        print "commandline"
    
        6
  •  2
  •   dowski    16 年前

    从快速查看PDB文档和源代码来看,似乎没有一种内置的方法可以做到这一点。我建议您设置一个环境变量,它指示正在进行调试,并让您的应用程序对此作出响应。

    $ USING_PDB=1 pdb yourprog.py
    

    然后在yourprog.py中:

    import os
    if os.environ.get('USING_PDB'):
        # debugging actions
        pass
    
        7
  •  2
  •   user491135    10 年前

    我找到了一个更干净的方法,

    只需在您的 manage.py

    #!/usr/bin/env python
    import os
    import sys
    
    if __debug__:
        sys.path.append('/path/to/views.py')
    
    
    if __name__ == "__main__":
        ....
    

    然后它会在调试时自动添加它。

        8
  •  1
  •   twasbrillig    10 年前

    您可以尝试查看stacktrace。

    https://docs.python.org/library/inspect.html#the-interpreter-stack

    在调试器会话中尝试此操作时:

    import inspect
    inspect.getouterframes(inspect.currentframe()
    

    您将获得一个框架记录列表,并可以查看引用PDB文件的任何框架。