有沒有一種簡單的方法可以在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