Как обнаружить, что код Python выполняется через отладчик?
Есть ли простой способ обнаружить внутри кода Python этот код выполняется через отладчик Python?
У меня есть небольшое приложение Python, которое использует код Java (благодаря JPype). Когда я отлаживаю часть Python, я бы хотел, чтобы встроенная JVM также предоставляла опции отладки.
Ответы
Ответ 1
Решение, работающее с 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, просто заменив pydevd.py
на pdb.py
. Как предположил do3cc, он пытается найти отладчик в стек вызывающего.
Полезные ссылки:
Ответ 2
Отладчики Python (а также профилировщики и средства покрытия) используют функцию sys.settrace
(в модуле sys
) для регистрации обратного вызова, который вызывается, когда происходят интересные события.
Если вы используете Python 2.6, вы можете вызвать sys.gettrace()
, чтобы получить текущую функцию обратного вызова. Если это не None
, то вы можете предположить, что вы должны передавать параметры отладки в JVM.
Не понятно, как вы могли сделать это до 2.6.
Ответ 3
Другой способ сделать это зависит от того, как запущен ваш интерпретатор python. Для этого требуется запуск Python с использованием -O для производства и без -O для отладки. Поэтому для этого требуется внешняя дисциплина, которую трудно поддерживать. Но опять же она может идеально соответствовать вашим процессам.
В документах python (см. "Встроенные константы" здесь или здесь):
__debug__
This constant is true if Python was not started with an -O option.
Использование будет примерно таким:
if __debug__:
print 'Python started without optimization'
Ответ 4
Другой альтернативой, если вы используете Pydev, который также работает в многопоточности, является:
try:
import pydevd
DEBUGGING = True
except ImportError:
DEBUGGING = False
Ответ 5
Если вы используете Pydev, вы можете обнаружить его таким образом:
import sys
if 'pydevd' in sys.modules:
print "Debugger"
else:
print "commandline"
Ответ 6
Чтобы быстро взглянуть на документы pdb и исходный код, это не похоже на встроенный способ сделать это. Я предлагаю вам установить переменную среды, указывающую, что выполняется отладка, и на ваше приложение ответьте.
$ USING_PDB=1 pdb yourprog.py
Затем в файле yourprog.py:
import os
if os.environ.get('USING_PDB'):
# debugging actions
pass
Ответ 7
Я нашел более чистый способ сделать это,
Просто добавьте следующую строку в manage.py
#!/usr/bin/env python
import os
import sys
if __debug__:
sys.path.append('/path/to/views.py')
if __name__ == "__main__":
....
Затем он автоматически добавит его при отладке.
Ответ 8
Вы можете попытаться заглянуть в свой стек.
https://docs.python.org/library/inspect.html#the-interpreter-stack
когда вы попробуете это в сеансе отладчика:
import inspect
inspect.getouterframes(inspect.currentframe()
вы получите список фрейм-записей и сможете заглянуть в кадры, относящиеся к файлу pdb.