有没有一种简单的方法可以在Python代码中检测到当前是否正在通过Python调试器执行代码?
我有一个小的Python应用程序,使用了Java代码(感谢JPype)。当我在调试Python部分时,我希望嵌入式JVM也能够传递调试选项。
Python调试器(以及分析工具和覆盖率工具)使用sys.settrace
函数(在sys
模块中)注册回调函数,当有趣的事件发生时,该函数会被调用。
如果您使用的是Python 2.6,则可以调用sys.gettrace()
来获取当前跟踪回调函数。 如果它不是None
,那么您可以假定应该将调试参数传递给JVM。
在2.6之前如何实现这一点并不清楚。
如果您使用Pydev并进行多线程处理,则另一种可行的替代方法是:
try:
import pydevd
DEBUGGING = True
except ImportError:
DEBUGGING = False
pip install pydevd
命令后... - bers这个解决方案适用于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,只需用 pdb.py
替换 pydevd.py
即可。正如 do3cc 建议的那样,它会在调用者的堆栈中查找调试器。
有用的链接:
any(True for frame in inspect.stack() if frame[1].endswith('pydevd.py'))
- Mattwmaster58__debug__
。 - dszimport sys
if 'pydevd' in sys.modules:
print "Debugger"
else:
print "commandline"
if 'pdb' in sys.modules: ...
。 - Jason R. Coombs由于原问题并没有特别指出Python2 - 这是为了确认 @babbageclunk 建议使用 sys 同样 适用于Python3:
from sys import gettrace as sys_gettrace
DEBUG = sys_gettrace() is not None
print("debugger? %s" % DEBUG)
$ USING_PDB=1 pdb yourprog.py
然后在yourprog.py中:
import os
if os.environ.get('USING_PDB'):
# debugging actions
pass
你可以尝试查看你的堆栈跟踪。
https://docs.python.org/library/inspect.html#the-interpreter-stack
当您在调试器会话中尝试此操作时:import inspect
inspect.getouterframes(inspect.currentframe()
您将获得一个框架记录列表,并可以查看任何引用pdb文件的帧。
manage.py
中添加以下行即可。#!/usr/bin/env python
import os
import sys
if __debug__:
sys.path.append('/path/to/views.py')
if __name__ == "__main__":
....
然后在你调试时,它会自动添加进去。
-o
标志。 - Christopher Barber
python -m pdb <program>
),那就不需要了。 - Casey Kuballpydevd
。 - Chris R. Donnelly