ipython -pylab отладка: можно ли остановить выполнение на определенной строке и перейти в оболочку? - PullRequest
5 голосов
/ 27 апреля 2011

При написании кода на Python (в основном numpy + matplotlib ) я обычно просто набираю код в vim и запускаю программу для его проверки:

python2 foo.py

Иногда, когда этого недостаточно, и мне нужно более тщательно изучить проблему, я просто запускаю программу в ipython: ipython -pylab foo.py, а затем проверьте переменные, протестируйте некоторые команды и так далее. Мне нравится ipython из-за завершения вкладки и доступности команд bash .

Для меня это работало достаточно хорошо, но теперь мои программы стали больше и включают много подпрограмм (в нескольких файлах). Подход ipython больше не работает, потому что он всегда выполняет полный код до конца foo.py (когда он падает в оболочку Pylab). Вместо этого я хотел бы остановить выполнение в данной строке подпрограммы (может быть в другом файле) и проверить там переменные. т.е. установить точку останова, при которой включается оболочка pylab.

Есть ли простой способ для адаптации моего ipython способа работы? Например. остановка на линии в bar.py

ipython -pylab --stop-at bar.py:423 foo.py

или остановитесь на имени подпрограммы в bar.py

ipython -pylab --stop-at bar.py:subroutine-name foo.py

Ответы [ 2 ]

5 голосов
/ 27 апреля 2011

Вы можете перейти в сеанс отладки IPython, вставив следующий код в нужную точку:

import sys, IPython
IPython.Shell.IPShell(argv=[])
IPython.Debugger.Pdb(IPython.ipapi.get().options.colors).set_trace(sys._getframe())

Не совсем то, что вы, похоже, ищете, но для меня это работает очень хорошо. Это также позволяет легко иметь сложные условные точки останова. Существует несколько других способов запуска сеанса отладки IPython из исходного файла, который плавает в Интернете, но, по моему опыту, в любом случае, он является наиболее надежным с точки зрения загрузки правильных цветов, правильного завершения вкладок и т. Д.

После начала сеанса отладки вы можете установить дополнительные точки останова с помощью команды break:

ipdb> break test.py:11
Breakpoint 1 at /tmp/test.py:11
ipdb> b my_function
Breakpoint 2 at /tmp/test.py:5

Чтобы его было легко вставить, вы можете установить комбинацию макросов / клавиш в вашем редакторе. Я также пользователь Vim, и у меня есть следующая таблица ключей в моем vimrc:

nmap <C-P><C-D> oimport sys, IPython<CR>IPython.Shell.IPShell(argv=[])<CR>IPython.Debugger.Pdb(IPython.ipapi.get().options.colors).set_trace(sys._getframe())<ESC>:w<CR>

В обычном режиме, нажав Ctrl-P, затем Ctrl-D вставляет код отладки после текущей строки с правильным отступом и затем сохраняет файл.

5 голосов
/ 27 апреля 2011

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

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