Как эффективно отлаживать Spyder в Python?

Мне нравится Python, и мне нравится Spyder, но я считаю отладку с помощью Spyder ужасной!

  • Каждый раз, когда я устанавливаю точку останова, мне нужно нажимать две кнопки: сначала кнопку отладки, а затем кнопку продолжения (она автоматически останавливается на первой строке), что меня раздражает.
  • Более того, вместо стандартной консоли iPython с автозаполнением и т. Д. У меня есть паршивая консоль ipdb ››, которая просто мусор.
  • Хуже всего то, что эта консоль очень часто зависает, даже если я пишу распечатки или простую оценку, чтобы попытаться выяснить, в чем проблема. Это намного хуже, чем MATLAB.
  • И последнее, но не менее важное: если я вызову функцию из консоли ipdb ›› и поставлю в нее точку останова, она не остановится на этом. Похоже, мне нужно поставить точку останова перед тем, как я начну отладку (Ctrl + F5).

У вас есть решение или, может быть, вы можете рассказать мне, как вы отлаживаете скрипты и функции Python?

Я использую новую установку Anaconda на 64-разрядной версии Windows 8.1.


person Hanan Shteingart    schedule 02.02.2015    source источник
comment
Не имеет отношения к сложной отладке, но мне часто приходится останавливаться на середине скрипта, чтобы использовать определенный набор переменных для дальнейшей разработки в консоли. Обычно я просто временно вставляю sys.exit(), но было бы удобнее, если бы у меня была опция точки останова.   -  person wick    schedule 02.04.2018


Ответы (7)


(Сопровождающий Spyder здесь) После нашей версии 4.2.0, выпущенной в ноябре 2020 года, возможности отладки в Spyder вполне удовлетворительны. Сейчас мы предоставляем то, что люди, пришедшие из Matlab, ожидали бы от отладчика, то есть чего-то, что работает как IPython и позволяет вам проверять и отображать переменные в текущей точке останова или кадре.

Теперь о ваших точках:

  1. Если в файле, который вы пытаетесь отладить, присутствует точка останова, Spyder переходит в режим отладки и продолжает работу до тех пор, пока не будет достигнута первая точка останова. Если он присутствует в другом файле, вам все равно нужно нажать сначала Debug, а затем Continue.

  2. IPdb - это консоль отладчика IPython. В Spyder 4.2.0 или выше он поставляется с автозавершением кода, подсветкой синтаксиса, просмотром истории команд с помощью стрелок вверх / вниз (отдельно от истории IPython), многострочным вычислением кода, а также встроенными и интерактивными графиками с помощью Matplotlib.

  3. Сейчас это исправлено. Кроме того, чтобы избежать конфликтов между кодом Python и командами Pdb, если у вас есть (например) переменная с именем n и вы напишите n в приглашении, чтобы увидеть ее значение, мы покажем ее вместо выполнения команды n Pdb. Чтобы вместо этого запустить эту команду, вы должны поставить перед ней восклицательный знак, например: !n

  4. Это тоже исправлено. Вы можете установить точки останова в IPdb, и они будут учтены в вашем текущем сеансе.

person Carlos Cordoba    schedule 02.02.2015
comment
Хочу отметить еще одну особенность, которую считаю важной. В настоящее время отладка возможна только через файл отладки, который запускает файл от начала до конца в отдельном сеансе, забывая все переменные, которые я мог определить в консоли. Было бы здорово начать отладку конкретной функции, передав ей переменные, уже определенные в моей рабочей области (которые иногда дорого пересчитывать) - person Leo; 26.07.2015
comment
@foobarssis, на данный момент нет, извините :-( - person Carlos Cordoba; 08.08.2016
comment
@CarlosCordoba Spyder переходит в режим отладки и выполняет программу, пока не будет достигнута первая точка останова. Это то, чего я ожидал. Хотел бы это увидеть. - person eric; 25.10.2017
comment
@neuronet, это уже работает, но только если вы нажмете кнопку Debug (т.е. синюю кнопку воспроизведения / паузы). - person Carlos Cordoba; 25.10.2017
comment
@CarlosCordoba Я думаю, что четвертая точка аналогична this (например, остановка в точке останова пока вы находитесь внутри точки останова). Я только что протестировал его в Spyder 3.2.6 и думаю, что он так не работает. Или я ошибаюсь? - person Igor; 17.01.2018
comment
@CarlosCordoba то, что я имею в виду, похоже на Matlab. Я помещаю точку останова в функцию x в строке 10. Когда я запускаю свой код, я попадаю в рабочую область этой функции, имея возможность посмотреть, какие переменные определены и т. Д. Я просто попробовал это и не получил ничего подобного (Spyder 3.3.1). Я использовал кнопку. Тем не менее, Spyder 3.3.1 - это фантастика: огромное улучшение по сравнению с 3.2. Для отладки я просто использую модуль logging и %debug python и игнорирую точки останова Spyder, они никогда не делают то, что я хочу от них. :( - person eric; 25.08.2018
comment
@neuronet, вы просто нажимаете кнопку Run (зеленую кнопку воспроизведения) и ожидаете, что ваш код остановится на вашей точке останова? Что ж, это то, что происходит в Matlab, но не в Spyder. В Spyder нужно нажать синюю кнопку воспроизведения / паузы. - person Carlos Cordoba; 16.10.2018
comment
@CarlosCordoba Я перепробовал все синие кнопки, к сожалению, мне так и не удалось заставить это работать с какими-либо кнопками. - person eric; 19.10.2018
comment
@neuronet, откройте вопрос об этом, чтобы лучше понять, что происходит в вашем случае. - person Carlos Cordoba; 19.10.2018
comment
@CarlosCordoba, хорошо, я не тороплюсь, чтобы не делать глупостей. :) - person eric; 21.10.2018
comment
@CarlosCordoba Я думаю, что у меня это работает. Мне нужно было убедиться, что во всем файле нет ошибок, и нажать кнопку воспроизведения / паузы (потому что такие вещи, как ctrl-F12, ничего не делали, пока я не перешел в режим отладки mode с помощью ctrl-F5). Теперь, когда я это вижу, я могу изучить это больше, но также гораздо лучше оценить ОП здесь и ваш ответ. Matlab просто так хорош с этим, что я привыкаю ... Некоторая четкая документация также будет иметь очень большое значение, в частности, для восстановления пользователей Matlab, которые ожидают, что Spyder будет похож на Matlab. - person eric; 24.11.2018
comment
@neuronet, я не очень хорошо понимаю вашу проблему и то, как мы могли бы улучшить ситуацию с помощью более качественной документации. Не могли бы вы открыть проблему в нашем трекере проблем, чтобы лучше объяснить ситуацию? Спасибо! - person Carlos Cordoba; 24.11.2018
comment
@CarlosCordoba Я говорил, что думаю, у меня больше нет проблемы: я просто делал это неправильно и ожидал, что это будет Matlab, а это не так (по причинам, указанным в вашем пункте номер 2 в вашем ответе) . Кроме того, как вы указываете, и это очевидно для всех, кроме меня, вам нужно войти в режим отладки (это ключевая путаница для эксплантов Matlab). Так что я думаю, что проблема не в Spyder, а в том, что я пытался сделать его похожим на Matlab. Что я сделаю, так это напишу документацию, которая могла бы мне помочь, и пошлю ее, чтобы узнать, пригодится ли она кому-нибудь. - person eric; 25.11.2018
comment
@neuronet, не могли бы вы помочь нам расширить нашу документацию, чтобы помочь другим пользователям Matlab , это было бы здорово! - person Carlos Cordoba; 25.11.2018

Рабочий процесс отладки

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

Предположим, вы хотите отладить этот код:

def Waiting_fun():                      #1 line number one
    for i in range(100):                #2
        pass                            #3
                                        #4 
def New_sum(lista, to_s = False):       #5
    result = 0                          #6
    print 1                             #7
    for i in lista:                     #8
        print "summed"                  #9   
        result +=i                      #10
    Waiting_fun()                       #11
    if to_s:                            #12
        result = str(result)
    return result
a = New_sum([1,4,5,7,8])
b = New_sum([1,4],1)
c = 456
d = New_sum([6,8,9],1)
final_result = a*b*c*d
Out: Type error

Быстрая первая отладка с использованием iPython% debug

%debug

Первое, что я делаю, это вызываю pdb из iPython с помощью волшебной команды %debug, вы можете установить ее как механизм по умолчанию, используя %pdb.

%debug
> /home/opdate/Desktop/test.py(23)<module>()
     19 a = New_sum([1,4,5,7,8])
     20 b = New_sum([1,4],1)
     21 c = 456
     22 d = New_sum([6,8,9],1)
---> 23 final_result = a*b*c*d

После обеда pdb. Вы можете найти все команды в официальных документах или использовать команду h для покажите их. На этом этапе я использую только следующие команды:

  • p: печатает указанные вами переменные
  • pp: красивые принты
  • args: если вы находитесь внутри функции, она печатает аргументы
  • pp locals(): может быть полезно распечатать все переменные, но в большинстве случаев это беспорядок!
  • ! используйте его, если хотите избежать конфликтов с командами, перечисленными в h
  • whatis имя_переменной: эквивалент типа (имя_переменной)
  • u: переместить текущий кадр на один уровень вверх в трассировке стека (к более старому кадру).
  • d: переместить текущий кадр на один уровень вниз в трассировке стека (к более новому кадру).
  • q: когда вы закончите, вы можете использовать q для выхода

В нашем случае:

ipdb> pp a,b,c,d
(25, '5', 456, '23')

Или ipdb> !a,b,c,d (без пробела между знаком эскламации и первым значением). Понятно, что b и d - это строки, если мы можем использовать:

ipdb> whatis b
<type 'str'>

Углубляемся с помощью точек останова

В 70% случаев %debug указывает вам на решение. Когда вам нужно больше функций, таких как точки останова, пора использовать Spyder. В этом случае мы хотим понять, почему b - это строка, рядом с которой мы ставим точку останова (двойной щелчок рядом с номером строки в окне редактора). Я считаю, гораздо лучше использовать для отладки стандартную консоль Python вместо консоли IPython, поэтому выберите консоль перед началом отладки:  введите описание изображения здесь

Затем откройте variable explorer, если есть какие-то переменные, удалите их. Я использую Ctrl + F5, чтобы начать отладку, вы можете использовать кнопки вверху, но я предпочитаю использовать их сочетания клавиш, показанные ниже:

введите описание изображения здесь

(Pdb) c # we go to the breakpoint 
(Pdb) s # we step into the function
(Pdb) args # we see what parameters are inserted
(Pdb) s # going step-by-step
(Pdb) ⏎ # series of Enters go line by line quicker
#Here I'll use  whatis command but in fact I just look to
# the type in variable explorer of spyder.
(Pdb) whatis result #check if result is still int
(Pdb) unt #or until -useful to exiting from loops see doc.
(Pdb) n # we  don't  enter to the Waiting_fun function
(Pdb) s # going step-by-step
(Pdb) whatis result #we find that there the int is converted
(Pdb) j 6 # for double checking we jump back to 6 were the result is assigned 
# We may be tempted to j(ump) to line 12 but doing so we would skip all the code
#for avoiding a series of `s`,`unt` and `n` we can use this solution:
(Pdb) tbreak 12 #set a new temporary breakpoint. Also `b` it's ok most of the time
(Pdb) c  # go to it 
(Pdb) j 6 # we jump to 6 the code we jump is NOT executed
(Pdb) whatis result# we find that if we jump 12-13 result is still int

Теперь мы нашли ошибку. Мы также можем протестировать решение, повторяем шаг до 12 и устанавливаем to_s = False

(Pdb) to_s = False #!to_s = False to be on the safe side

Оно работает. Одной из важных особенностей использования стандартного pdb в консоли Python является то, что у вас есть автоконкурс, и вы можете использовать проводник переменных вместо использования whatis и pp:

введите описание изображения здесь

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

Условные точки останова

Еще один более умный способ найти ошибку - использовать условную точку останова (Shift + F12). Большое преимущество Spyder заключается в отладке и использовании список точек останова. Условные точки останова активируются, когда условие равно True. В нашем случае мы хотим определить, где b становится строкой, поэтому условие будет: type(b) == str. Обычно я помещаю много условных точек останова и смотрю, какие из них соответствуют условию. Для этого не используйте Shift + F12, а поместите обычные точки останова, дважды щелкнув рядом со строкой, и перейдите в раздел «Отладка-› Список точек останова », скопируйте и вставьте условие в таблицу к каждой точке останова, как показано на рисунке ниже.

введите описание изображения здесь

Отсюда следует использовать следующие команды:

(Pdb) c  # go to the first
(Pdb) u # it helps to understand when it happened
(Pdb) d # come back to the breakpoint
person G M    schedule 01.12.2017

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

import pdb

def yourfunction():
    # Interesting stuff done here
    pdb.set_trace() 

Хорошее введение в отладку с помощью pdb https://pythonconquerstheuniverse.wordpress.com/category/python-debugger/

person LtGlahn    schedule 29.12.2016
comment
К сожалению: NOTE: The Python console is going to be REMOVED in Spyder 3.2. Please start to migrate your work to the IPython console instead. - person C8H10N4O2; 01.03.2018

Вот как я отлаживаю Spyder, чтобы избежать зависания IDE. Я делаю это, если изменяю сценарий в режиме отладки.

  1. Я закрываю текущую консоль IPython (отладочную) [x]
  2. Откройте новый [Панель меню-> Консоли-> Открыть консоль IPython]
  3. Снова войдите в режим отладки [синяя кнопка паузы воспроизведения].

Все еще немного раздражает, но у него есть дополнительное преимущество очистки (сброса) списка переменных.

person oogieoogieful    schedule 18.08.2016

По-видимому, никто никогда раньше не упоминал об этих двоих:

До Python я использовал VBA. Хотя это относительно старый язык, который не обновляется регулярно, одна вещь, которая мне нравилась в VBA, - это функция отладки. Две функции отладки, которые наиболее близки к VBA или которые также можно назвать «визуальной отладкой», с которыми я столкнулся:

Отладчик 1-PyCharm

Это 6-минутное видео демонстрирует отладчик PyCharm.

2-PixieDebugger - отладчик Visual Python для блокнотов Jupyter, которые вы всегда хотели

Поскольку многие программисты склонны использовать JupyterNotebook, этот отладчик может пригодиться. PixieDebugger почти такой же, как отладчик PyCharm. Я не буду здесь вдаваться в подробности.

Но вы можете обратиться к этому ссылка

person mcagriardic    schedule 20.09.2018
comment
Вопрос касается Spyder, и ни один из упомянутых вами отладчиков не может использоваться в Spyder. - person Carlos Cordoba; 20.09.2018
comment
Я знаю об этом. Я просто выделял различные типы визуальных отладчиков Python. Не обязательно для Spyder. - person mcagriardic; 20.09.2018

Одно незначительное дополнение к пункту 3:

Мне также казалось, что консоль отладки часто зависала, выполняла печать, оценку и т. Д., Но нажатие кнопки остановки (Exit debug) обычно возвращало ее в конец стека вызовов, а затем я мог вернуться вверх ('u') к кадру, в котором я отлаживал. Стоит попробовать. Это может быть для более поздней версии Spyder (2.3.5.2).

person Paul    schedule 28.04.2016

Вы можете использовать сочетания клавиш отладки, например: Перейти F10 Перейти в F11 в инструментах> настройки> сочетания клавиш

person Mahyar    schedule 19.03.2018