有没有一种简单的方法可以在Python代码中检测到这段代码是通过Python调试器执行的?如何检测Python代码是否正在通过调试器执行?
我有一个使用Java代码的小型Python应用程序(感谢JPype)。当我调试Python部分时,我希望为嵌入式JVM提供调试选项。
有没有一种简单的方法可以在Python代码中检测到这段代码是通过Python调试器执行的?如何检测Python代码是否正在通过调试器执行?
我有一个使用Java代码的小型Python应用程序(感谢JPype)。当我调试Python部分时,我希望为嵌入式JVM提供调试选项。
的溶液与Python 2.4工作和Pydev的(它应该与任何版本优于2.1工作):
import inspect
def isdebugging():
for frame in inspect.stack():
if frame[1].endswith("pydevd.py"):
return True
return False
同样应该通过简单地用pdb.py
替换pydevd.py
与PDB工作。正如do3cc建议的那样,它会尝试在调用者堆栈中找到调试器。
相关链接:
通过快速浏览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。
你可以尝试窥视你的堆栈跟踪。
https://docs.python.org/library/inspect.html#the-interpreter-stack
当您尝试这在调试会话:
import inspect
inspect.getouterframes(inspect.currentframe()
你会得到framerecords的列表,并可以窥视为参考PDB文件的任何帧。
如果您使用Pydev的,你可以检测到它以这样一种方式:
import sys
if 'pydevd' in sys.modules:
print "Debugger"
else:
print "commandline"
我发现了一个更清洁的方式做到这一点,
只需添加下面的行放在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,如果没有断点设置工作。 – apoorvkul 2014-12-05 07:37:36