如何通过调试器检测Python代码?

时间:2008-12-02 13:58:30

标签: python

在Python代码中是否有一种简单的方法可以检测到这些代码是通过Python调试器执行的?

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

8 个答案:

答案 0 :(得分:19)

Python调试器(以及分析器和覆盖工具)使用sys.settrace函数(在sys模块中)来注册在发生有趣事件时调用的回调。

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

目前尚不清楚如何在2.6之前做到这一点。

答案 1 :(得分: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

只需将pydevd.py替换为pdb.py,就可以使用pdb。正如do3cc建议的那样,它试图在调用者的堆栈中找到调试器。

有用的链接:

答案 2 :(得分:7)

另一种方法取决于你的python解释器是如何启动的。它要求你使用-O启动Python进行生产,没有-O进行调试。因此,它确实需要一个可能难以维护的外部规则......但是,它可能会完全适合您的流程。

来自python文档(请参阅“内置常量”herehere):

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

用法如下:

if __debug__:
    print 'Python started without optimization'

答案 3 :(得分:7)

如果您使用也适用于多线程的Pydev,则可以使用其他替代方法:

try:
    import pydevd
    DEBUGGING = True
except ImportError:
    DEBUGGING = False

答案 4 :(得分:5)

如果你正在使用Pydev,你可以用这样的方式检测它:

import sys
if 'pydevd' in sys.modules: 
    print "Debugger"
else:
    print "commandline"

答案 5 :(得分:2)

从快速浏览一下pdb文档和源代码,看起来没有内置的方法来做到这一点。我建议您设置一个环境变量,指示调试正在进行中,并让您的应用程序对此做出响应。

$ USING_PDB=1 pdb yourprog.py

然后在yourprog.py中:

import os
if os.environ.get('USING_PDB'):
    # debugging actions
    pass

答案 6 :(得分:2)

我发现了一种更清洁的方法,

只需在manage.py

中添加以下内容即可
#!/usr/bin/env python
import os
import sys

if __debug__:
    sys.path.append('/path/to/views.py')


if __name__ == "__main__":
    ....

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

答案 7 :(得分:1)

您可以尝试查看堆栈跟踪。

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

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

import inspect
inspect.getouterframes(inspect.currentframe()

您将获得一个framerecords列表,并可以查看引用pdb文件的任何帧。