Из того, что я прочитал, есть два способа отладки кода в Python:
С традиционным отладчиком, таким как
pdb
илиipdb
. Это поддерживает такие команды, какc
forcontinue
,n
forstep-over
,s
forstep-into
и т. Д.), Но у вас нет прямого доступа к оболочке IPython, которая может быть чрезвычайно полезна для проверки объектов.Использование IPython путем встраивания оболочки IPython в ваш код. Вы можете сделать
from ipython import embed
, а затем использоватьembed()
в своем коде. Когда ваша программа / скрипт попадает вembed()
оператор, вы попадаете в оболочку IPython. Это позволяет полностью проверять объекты и тестировать код Python, используя все возможности IPython. Тем не менее, при использованииembed()
вы не можете пошагово пройти код с удобными сочетаниями клавиш.
Есть ли способ объединить лучшее из обоих миров? Т.е.
- Иметь возможность шаг за шагом пролистывать свой код с помощью удобных сочетаний клавиш pdb / ipdb.
- На любом таком шаге (например, для данного оператора) имейте доступ к полноценной оболочке IPython .
Отладка IPython как в MATLAB:
Пример такого типа «расширенной отладки» можно найти в MATLAB, где пользователь всегда имеет полный доступ к ядру / оболочке MATLAB, и он все еще может шаг за шагом просматривать свой код, определять условные точки останова и т. Д. То, что я обсуждал с другими пользователями, это функция отладки, которую люди больше всего упускают при переходе с MATLAB на IPython.
Отладка IPython в Emacs и других редакторах:
Я не хочу делать вопрос слишком конкретным, но я работаю в основном в Emacs, поэтому мне интересно, есть ли способ привнести в него эту функциональность. В идеале Emacs (или редактор) позволит программисту устанавливать точки останова в любом месте кода и связываться с интерпретатором или отладчиком, чтобы он останавливался в выбранном вами месте, и приводил к полному интерпретатору IPython в этом месте.
!
команда, которая выполняет любую команду python в точке остановаОтветы:
Вы можете использовать
%pdb
магию IPython . Просто позвоните%pdb
в IPython, и когда возникнет ошибка, вы автоматически попадете наipdb
. Пока у вас нет ступеньки сразу, вы попадаетеipdb
потом.Это облегчает отладку отдельных функций, так как вы можете просто загрузить файл,
%load
а затем запустить функцию. Вы можете вызвать ошибку сassert
правильной позиции.%pdb
это линия магии. Назовите это , как%pdb on
,%pdb 1
,%pdb off
или%pdb 0
. Если вызывается без аргумента, он работает как переключатель.источник
ipython --pdb file.py -- args
и исключить в ipdb после исключения. Возможно, стоит добавить к ответу.Как насчет ipdb.set_trace ()? В вашем коде:
import ipdb; ipdb.set_trace()
Обновление : теперь в Python 3.7 мы можем написать
breakpoint()
. Он работает так же, но также подчиняетсяPYTHONBREAKPOINT
переменной окружения. Эта особенность происходит от этого ПКП .Это позволяет полностью проверить ваш код, и у вас есть доступ к таким командам, как
c
(продолжить),n
(выполнить следующую строку),s
(перейти к методу в точке) и так далее.Увидеть репозиторий ipdb и список команд . IPython теперь называется (правка: часть) Jupyter .
PS: обратите внимание, что команда ipdb имеет приоритет над кодом Python. Таким образом, чтобы написать
list(foo)
вам нужноprint list(foo)
.Кроме того, если вам нравится приглашение ipython (его режимы emacs и vim, история, дополнения и т. Д.), То легко получить то же самое для вашего проекта, поскольку оно основано на наборе инструментов для приглашения python .
источник
ipdb
в Emacs, используяRealGUD
иisend-mode
делать именно то, что просит OP.breakpoint()
это чудесно. В PyCharm он даже бросает вас в отладчик PyCharm. Это также быстрый способ войти в отладчик PyCharm из функций, которые были вставлены в консоль.(Обновление от 28 мая 2016 г.) Использование RealGUD в Emacs
Для любого в Emacs этот поток показывает, как выполнить все, что описано в OP (и более), используя
ipdb
).isend-mode
.Комбинация этих двух пакетов является чрезвычайно мощной и позволяет воссоздать в точности поведение, описанное в ОП, и сделать еще больше.
Больше информации о вики-статье RealGUD для ipdb.
Оригинальный ответ:
После того, как я попробовал много разных методов отладки Python, включая все, что упоминалось в этом потоке, один из моих предпочтительных способов отладки Python с IPython - это встроенные оболочки.
Определение пользовательской встроенной оболочки IPython:
Добавьте следующее в скрипт
PYTHONPATH
, чтобы методipsh()
стал доступным.Затем, когда я хочу что-то отладить в своем коде, я помещаю его
ipsh()
прямо в то место, где мне нужно выполнить проверку объекта и т. Д. Например, скажем, я хочу отладитьmy_function
нижеИспользуй это:
и затем я вызываю
my_function(2)
одним из следующих способов:Независимо от того, как я вызываю его, интерпретатор останавливается на линии , что говорит
ipsh()
. Как только вы закончите, вы можете это сделать,Ctrl-D
и Python возобновит выполнение (с любыми изменениями, которые вы сделали). Обратите внимание, что если вы запускаете код из обычного IPython-оболочки IPython (случай 2 выше), новая оболочка IPython будет вложена в ту, из которой вы ее вызывали, что прекрасно, но об этом следует знать. В любом случае, когда переводчик останавливается на местеipsh
, я могу проверить значениеa
(которое будет2
), посмотреть, какие функции и объекты определены, и т. Д.Эта проблема:
Приведенное выше решение может быть использовано для остановки Python в любом месте кода, а затем для перевода в полноценный интерпретатор IPython. К сожалению, он не позволяет вам добавлять или удалять точки останова после запуска скрипта, что очень расстраивает. На мой взгляд, это единственный , что мешает IPython стать отличным инструментом отладки для Python.
Лучшее, что вы можете сделать сейчас:
Обходной путь - разместить
ipsh()
a priori в разных местах, где вы хотите, чтобы интерпретатор Python запускал оболочку IPython (то есть abreakpoint
). Затем вы можете «перепрыгнуть» между различными предопределенными жестко закодированными «точками останова»Ctrl-D
, что приведет к выходу из текущей встроенной оболочки IPython и остановке снова, когда интерпретатор выполнит следующий вызовipsh()
.Если вы идете по этому пути, один из способов выйти из «режима отладки» и игнорировать все последующие точки останова, это использовать,
ipshell.dummy_mode = True
что заставит Python игнорировать любые последующие экземплярыipshell
объекта, который мы создали выше.источник
import inspect
прежде чем это сработало. Настройка командной строки, кажется, сломана для меня, хотя.import ipdb; ipdb.set_trace()
? Может быть, я что-то упускаю, но я не вижу преимущества вашего гораздо более сложного метода.Вы можете начать сеанс IPython из pudb и вернуться к сеансу отладки, как вам нравится.
Кстати, ipdb использует IPython за кулисами, и вы действительно можете использовать функциональные возможности IPython, такие как завершение TAB и магические команды (начинающиеся с
%
). Если вы в порядке с ipdb, вы можете запустить его с IPython, используя такие команды, как%run
и%debug
. Сеанс ipdb на самом деле лучше, чем обычный IPython, в том смысле, что вы можете идти вверх и вниз в трассировке стека и т. д. Чего не хватает в ipdb для «проверки объекта»?Кроме того, python.el в комплекте с Emacs> = 24.3 имеет хорошую поддержку ipdb.
источник
M-x ansi-term
буфере, а затем использую isend-mode, чтобы привязать мои исходные буферы к буферу IPython, чтобы я мог отправить код интерпретатору IPython с помощью сочетания клавиш, который автоматически отправляет%paste
магию в буфер IPython. Это позволяет мне быстро тестировать регионы в IPython. Я всегда запускаю свои программы из этой оболочки IPythonrun
и используюembed()
для остановки.ipdb
сеанс отладки, используяpython.el
такие вещи иsend-region
т.п. в соответствующей оболочке? В общем, где я могу найти больше информации об этом?%run
или%debug
. Я думаю,import ipdb; ipdb.set_trace()
работает тоже. Я не думаю, что вы можете отправить несколько строк в ipdb. Это ограничение ipdb. Но, вероятно,%paste
трюк работает. Вы можете отправить запрос на добавление в IPython dev.Похоже, что подход в ответе @ gaborous устарел .
Новый подход выглядит следующим образом:
источник
ipdb
Позволяет ли это использовать операторы внутри оболочки ipython при отладке?Префикс "!" Символ для команд, которые вы вводите в pdb, похоже, имеет тот же эффект, что и действие в оболочке IPython. Это работает для доступа к справке для определенной функции или даже к именам переменных. Может быть, это поможет вам в некоторой степени. Например,
Но! Help (numpy.transpose) предоставит вам ожидаемую страницу справки на numpy.transpose. Аналогично, для имен переменных, скажем, у вас есть переменная l, набрав «l» в pdb, вы увидите код, но! L напечатает значение l.
источник
Вы пробовали этот совет ?
источник
Вы можете начать
IPython
изнутриipdb
!Индуцировать
ipdb
отладчик 1 :Введите IPython изнутри в
ipdb>
консоли 2 :Вернитесь к
ipdb>
консоли изнутриIPython
:Если вам повезло использовать Emacs, все станет еще удобнее!
Это требует использования
M-x shell
. Используяyasnippet
и bm , определите следующий фрагмент. Это заменит текстipdb
в редакторе наset-trace
строку. После вставки фрагмента строка будет выделена, чтобы ее было легко заметить и с которой можно было ориентироваться. ИспользуйтеM-x bm-next
для навигации.1 Все в одной строке для легкого удаления. Так
imports
как это происходит только один раз, эта форма гарантирует,ipdb
что будет импортирована, когда вам это нужно, без лишних затрат.2 Вы можете сэкономить при печати, импортировав
IPython
в свой.pdbrc
файл :Это позволяет вам просто звонить
embed()
изнутриipdb
(конечно, только когда IPython установлен).источник
Один из вариантов - использовать IDE, например Spyder, который позволит вам взаимодействовать с вашим кодом во время отладки (фактически, с помощью консоли IPython). На самом деле, Spyder очень похож на MATLAB, что, я полагаю, было намеренным. Сюда входят инспекторы переменных, редактирование переменных, встроенный доступ к документации и т. Д.
источник
правильный, легкий, классный, точный ответ на вопрос - использовать макрос% run с флагом -d.
источник
%save /tmp/foo.py x-y
код, который я хочу запустить и отладить, а затем%run -d /tmp/foo.py
установить точку останова, где мне нравится. Отличный ответ!Если вы введете exit () в консоли embed (), код продолжится и перейдет к следующей строке embed ().
источник
Pyzo IDE имеет такие же возможности , как ОП просили. Вам не нужно начинать в режиме отладки. Подобно MATLAB, команды выполняются в оболочке. Когда вы устанавливаете точку останова в некоторой строке исходного кода, IDE останавливает выполнение там, и вы также можете отлаживать и выполнять обычные команды IPython.
Тем не менее, кажется, что пошаговое выполнение не (пока?) Не работает должным образом (то есть остановка в одной строке и затем переход в другую функцию), если вы не установите другую точку останова.
Тем не менее, исходя из MATLAB, это лучшее решение, которое я нашел.
источник
Начиная с python 3.2, у вас есть
interact
команда, которая дает вам доступ к полному командному пространству python / ipython.источник
Запуск изнутри оболочки Emacs IPython и точка останова, установленная через pdb.set_trace (), должны работать.
Проверяется с помощью python-mode.el, Mx ipython RET и т. Д.
источник
Разработка нового кода
Отладка внутри IPython
Пример ячейки:
Отладка существующего кода
IPython внутри отладки
pytest ... --pdbcls=IPython.terminal.debugger:TerminalPdb --pdb
breakpoint()
,python -m ipdb
и т.д.Мысли о Python
Я согласен с ОП в том, что многие вещи, которые MATLAB хорошо выполняет в Python, по-прежнему отсутствуют и действительно должны, поскольку практически все в языке поддерживает скорость разработки по сравнению со скоростью производства. Возможно, когда-нибудь я внесу не только тривиальные исправления ошибок в CPython.
https://github.com/ipython/ipython/commit/f042f3fea7560afcb518a1940daa46a72fbcfa68
Смотрите также Возможно ли запускать команды в IPython с отладкой?
источник