Как определить, что код Python выполняется через отладчик? - PullRequest
21 голосов
/ 02 декабря 2008

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

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

Ответы [ 8 ]

19 голосов
/ 02 декабря 2008

Отладчики Python (а также профилировщики и инструменты покрытия) используют функцию sys.settrace (в модуле sys) для регистрации обратного вызова, который вызывается при возникновении интересных событий.

Если вы используете Python 2.6, вы можете вызвать sys.gettrace(), чтобы получить текущую функцию обратного вызова трассировки. Если это не None, то вы можете предположить, что должны передавать параметры отладки в JVM.

Непонятно, как это можно сделать до 2.6.

10 голосов
/ 03 декабря 2008

Решение, работающее с 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, он пытается найти отладчик в стеке вызывающей стороны.

Полезные ссылки:

7 голосов
/ 28 октября 2014

Другой вариант, если вы используете Pydev, который также работает в многопоточности:

try:
    import pydevd
    DEBUGGING = True
except ImportError:
    DEBUGGING = False
7 голосов
/ 06 ноября 2011

Другой способ сделать это зависит от того, как запускается ваш интерпретатор 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'
5 голосов
/ 25 сентября 2011

Если вы используете Pydev, вы можете обнаружить его следующим образом:

import sys
if 'pydevd' in sys.modules: 
    print "Debugger"
else:
    print "commandline"
2 голосов
/ 29 марта 2014

Я нашел более чистый способ сделать это,

Просто добавьте следующую строку в manage.py

#!/usr/bin/env python
import os
import sys

if __debug__:
    sys.path.append('/path/to/views.py')


if __name__ == "__main__":
    ....

Тогда он автоматически добавит его при отладке.

2 голосов
/ 02 декабря 2008

Если взглянуть на документы и исходный код pdb, то не похоже, что для этого есть встроенный способ. Я предлагаю установить переменную среды, которая указывает на то, что выполняется отладка, и чтобы ваше приложение ответило на это.

$ USING_PDB=1 pdb yourprog.py

Тогда в yourprog.py:

import os
if os.environ.get('USING_PDB'):
    # debugging actions
    pass
1 голос
/ 02 декабря 2008

Вы можете попытаться заглянуть в свою трассировку стека.

https://docs.python.org/library/inspect.html#the-interpreter-stack

при попытке выполнить это в сеансе отладчика:

import inspect
inspect.getouterframes(inspect.currentframe()

вы получите список записей кадров и сможете искать любые кадры, ссылающиеся на файл pdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...