Как я могу интерактивно отлаживать исключения в Python, используя что-то кроме IDLE? - PullRequest
5 голосов
/ 20 марта 2012

Когда я использую IDLE для запуска сценария, если сценарий обнаруживает исключение и выполнение останавливается, у меня остается интерактивная оболочка, которую я могу использовать для исследования состояния приложения во время исключения. Это действительно хорошо, но в остальном мне не хватает IDLE как редактора. Есть ли способ, которым я могу получить это поведение "перетащить в интерактивную оболочку на исключениях" без использования IDLE? enter image description here

Ответы [ 6 ]

6 голосов
/ 20 марта 2012

Я предлагаю использовать eclipse с pydev .У него много опций отладки, я не вижу никаких преимуществ в использовании оболочки для отладки.Попробуйте, и вы можете, я говорю.

3 голосов
/ 20 марта 2012

Вы можете использовать модуль pdb .

import pdb
try:
    i = 0
    i = i + 'a string'
except Exception, err:
    pdb.set_trace()
2 голосов
/ 06 марта 2015

Запустите ваш скрипт следующим образом:

python -m pdb myscript.py

Консоль покажет вам:

> /home/user/dir/myscript.py(2)<module>()

-> first_line (of_my_script) (PDB)

Тип продолжить

Подождите, пока что-нибудь взорвется:

TypeError: invalid type comparison
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /home/user/problemscript.py(567)na_op()
-> raise TypeError("invalid type comparison")
(Pdb)

С этого момента вы, в основном, находитесь в MUD и применяется удивительное количество стандартных команд.

Введите , где или w , чтобы увидеть, где вы находитесь в стеке:

(Pdb) w
-> return df[df['type']=='dev'][['Dist','Count']].as_matrix()
  /home/user/core/ops.py(603)wrapper()
-> res = na_op(values, other)
> /home/user/core/ops.py(567)na_op()
-> raise TypeError("invalid type comparison")

Видите эту маленькую > стрелу? Вот где мы в стеке.

Используйте список или l , чтобы осмотреться:

(Pdb) list
564               try:
565                   result = getattr(x, name)(y)
566                   if result is NotImplemented:
567  >>                     raise TypeError("invalid type comparison")
568               except (AttributeError):
569  ->                 result = op(x, y)
570   
571           return result
572   
573       def wrapper(self, other):
574           if isinstance(other, pd.Series):

Для перемещения по стеку продолжайте MUDing и используйте вверх ( u ) или вниз ( d ).

Используйте args ( a ), чтобы проверить, с какими аргументами была вызвана текущая функция:

(Pdb) args
dat = array([], shape=(0, 3), dtype=float64)
dev_classes = {81, 82, 21, 22, 23, 24, 31}

Используйте p , чтобы распечатать содержимое переменной (или pp , чтобы красиво напечатать (или обработать основные потребности вашего персонажа)):

(Pdb) p df
Empty DataFrame
Columns: [Dist, type, Count]
Index: []

Используйте взаимодействовать , чтобы ввести код в текущей точке стека. Ctrl + D возвращает вас обратно в PDB.

Вперед! Потребуется много смелых и могучих искателей приключений, чтобы повернуть назад собравшиеся орды гоблинов, которые теперь окружают город. Сможете ли вы победить Короля гоблинов и вернуть землю для рас?

1 голос
/ 20 марта 2012

Запустите ваш скрипт из интерпретатора команд python (import it), и, когда возникнет исключение, выполните import pdb; pdb.pm(), чтобы получить отладчик в точке после возникновения исключения.

1 голос
/ 20 марта 2012

ИМХО, если вы работаете в Python и не используете IPython , вы тратите свое время (в буквальном смысле).

В нем вы можете включить или выключить pdb, просто набрав "волшебную" команду pdb.Новые опции qtconsole (мой любимый) и ноутбуков делают эту убийственную среду еще лучше.

1 голос
/ 20 марта 2012

python -i yourscript перейдет в интерактивную оболочку, когда выйдет yourscript. На данный момент вы можете запустить:

>>> import pdb
>>> pdb.pm()

... и получите интерактивную отладочную оболочку.

См. документацию PDB .

...