Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测通过调试器执行的Python代码?_Python_Debugging - Fatal编程技术网

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

如何检测通过调试器执行的Python代码?,python,debugging,Python,Debugging,在Python代码中,是否有一种简单的方法可以检测该代码是否通过Python调试器执行 我有一个使用Java代码的小型Python应用程序(感谢JPype)。当我调试Python部分时,我希望嵌入式JVM也有调试选项。通过快速查看pdb文档和源代码,看起来没有内置的方法来完成这项工作。我建议您设置一个环境变量来指示调试正在进行,并让您的应用程序对此做出响应 $ USING_PDB=1 pdb yourprog.py 然后在yourprog.py中: import os if os.enviro

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


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

通过快速查看pdb文档和源代码,看起来没有内置的方法来完成这项工作。我建议您设置一个环境变量来指示调试正在进行,并让您的应用程序对此做出响应

$ USING_PDB=1 pdb yourprog.py
然后在yourprog.py中:

import os
if os.environ.get('USING_PDB'):
    # debugging actions
    pass
Python调试器(以及探查器和覆盖工具)使用
sys.settrace
函数(在
sys
模块中)注册一个回调,在发生有趣的事件时调用该回调

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


在2.6版本之前,还不清楚您如何做到这一点。

您可以尝试查看stacktrace

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

import inspect
inspect.getouterframes(inspect.currentframe()

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

一个使用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所建议的,它尝试在调用者的堆栈中查找调试器

有用链接:


如果您正在使用Pydev,您可以通过以下方式检测它:

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

另一种方法取决于python解释器的启动方式。它要求启动Python时使用-O进行生产,而不使用-O进行调试。因此,它确实需要一种可能难以维持的外部纪律。。但是,它可能会非常适合您的流程

从python文档(请参阅“内置常量”或):

用法类似于:

if __debug__:
    print 'Python started without optimization'

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

只需在
manage.py中添加以下行

#!/usr/bin/env python
import os
import sys

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


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

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

如果您使用的是在多线程中也能工作的Pydev,则其他替代方法是:

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

虽然这似乎是一种更简洁的方法,但如果没有设置断点,它在pdb中就不起作用。嗯,你说得对,这一定是调试器使用的优化。也就是说,大多数情况下,当您在调试器中运行时,您都会设置断点。@babbagelunk,如果您只是试图在程序崩溃时查看环境(我最常用的处理方式:
python-m pdb
),则不会设置断点。您可能需要检查其他跟踪用户,如。。。如果它真的是一个调试器,那么它应该是一个名称中带有
pydevd
的类型。类似地,如果sys.modules中的'pdb:…
使用pdb,那么它也是一个类型。我发现这种技术在某些情况下是不可行的,例如.No。这取决于您是否使用
-o
标志运行python。一行代码:
any(如果frame[1].endswith('pydevd.py'),则inspect.stack()中的frame为True)
这并不是问题的真正答案-即使没有在调试器下运行(但没有使用
-o
“optimize”标志),您也会得到
\uu调试\/code>。事实上,因此,“需要外部纪律”警告。
try:
    import pydevd
    DEBUGGING = True
except ImportError:
    DEBUGGING = False