如何检测通过调试器执行的Python代码?
在Python代码中,是否有一种简单的方法可以检测该代码是否通过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
我有一个使用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所建议的,它尝试在调用者的堆栈中查找调试器
有用链接:
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