





Беглый взгляд на документацию 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.
Хм, вы правы - это должна быть оптимизация, которую использует отладчик. Тем не менее, большую часть времени, когда вы работаете в отладчике, у вас будет установлена точка останова.
@babbageclunk, а не если вы просто пытаетесь посмотреть на окружающую среду, когда программа вылетает (мой самый распространенный способ делать что-то: python -m pdb <program>).
Вы можете проверить наличие альтернативных пользователей трассировки, таких как pytest-cov ... если это действительно отладчик, он должен быть типа с pydevd в имени.
Вы можете попытаться заглянуть в свою трассировку стека.
https://docs.python.org/library/inspect.html#the-interpreter-stack
когда вы попробуете это в сеансе отладчика:
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
То же самое должно работать с pdb, просто заменив pydevd.py на pdb.py. Как и предполагал do3cc, он пытается найти отладчик в стеке вызывающего.
Полезные ссылки:
Один вкладыш: any(True for frame in inspect.stack() if frame[1].endswith('pydevd.py'))
Если вы используете Pydev, вы можете обнаружить это следующим образом:
import sys
if 'pydevd' in sys.modules:
print "Debugger"
else:
print "commandline"
Аналогично if 'pdb' in sys.modules: ... при использовании pdb.
Я обнаружил, что этот метод неприменим при некоторых обстоятельствах, таких как когда тесты запускаются с pytest.
Другой способ сделать это зависит от того, как запускается ваш интерпретатор 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'
Это не совсем ответ на вопрос - вы получаете __debug__, даже когда нет работает под отладчиком (но не использовал флаг «оптимизировать» -O).
В самом деле, отсюда следует предостережение «требуется внешняя дисциплина».
Я нашел более чистый способ сделать это,
Просто добавьте следующую строку в свой manage.py
#!/usr/bin/env python
import os
import sys
if __debug__:
sys.path.append('/path/to/views.py')
if __name__ == "__main__":
....
Затем он автоматически добавит его при отладке.
Нет. Это просто зависит от того, запускали ли вы python с флагом -o.
Другой альтернативой, если вы используете Pydev, который также работает в многопоточности, является:
try:
import pydevd
DEBUGGING = True
except ImportError:
DEBUGGING = False
Хотя это кажется более чистым способом, он не работает в pdb, если не установлена точка останова.