Подтвердить что ты не робот

Как обнаружить, что код Python выполняется через отладчик?

Есть ли простой способ обнаружить внутри кода Python этот код выполняется через отладчик Python?

У меня есть небольшое приложение Python, которое использует код Java (благодаря JPype). Когда я отлаживаю часть Python, я бы хотел, чтобы встроенная JVM также предоставляла опции отладки.

4b9b3361

Ответ 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.