Emacs: методы отладки python - PullRequest
       4

Emacs: методы отладки python

7 голосов
/ 28 декабря 2010

Я разместил это на programmers.stackexchange.com , но я подумал, что это может быть более подходящим для SO.

Я использую emacs для всех моих нужд редактирования кода. Как правило, я использую Mx-компиляцию для запуска моего тестового прогона, который, я бы сказал, дает мне около 70% того, что мне нужно сделать, чтобы сохранить код в нужном направлении, однако в последнее время я удивлялся, как можно использовать Mx pdb на случаи, когда было бы неплохо достичь точки останова и осмотреть вещи.

В моем поиске я нашел некоторые вещи , которые предполагают, что это полезно / возможно. Однако мне не удалось заставить его работать таким образом, чтобы я полностью понимал.

Я не знаю, может быть, это сочетание buildout + appengine, которое может усложнить задачу, но когда я пытаюсь сделать что-то вроде

M-x pdb
Run pdb (like this): /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/

Где ... / bin / python - это компоновщик интерпретатора с путем, заданным для всех яиц.

~ / bin / pdb - это простой скрипт для вызова pdb.main с использованием текущего интерпретатора python

HellooKitty:hydrant twillis$ cat ~/bin/pdb
#! /usr/bin/env python

if __name__ == "__main__":
    import sys
    sys.version_info
    import pdb
    pdb.main()
HellooKitty:hydrant twillis$ 

... / bin / devappserver - это скрипт dev_appserver, который используется в рецепте компоновки для проекта gae, а ... / parts / hydrant-app - это путь к app.yaml

Мне впервые предлагают приглашение

Current directory is /Users/twillis/bin/
C-c C-f

Ничего не происходит, но

HellooKitty:hydrant twillis$ ps aux | grep pdb
twillis    469 100.0  1.6   168488  67188 s002  Rs+   1:03PM   0:52.19 /usr/local/bin/python2.5 /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/
twillis    477   0.0  0.0  2435120    420 s000  R+    1:05PM   0:00.00 grep pdb
HellooKitty:hydrant twillis$ 

что-то происходит

C-x [space]

сообщит, что точка останова была установлена. Но я не могу добиться успеха.

Такое ощущение, что мне здесь не хватает чего-то очевидного. Я?

Так стоит ли интерактивная отладка в emacs? Возможна ли интерактивная отладка приложения Google Appengine? Любые предложения о том, как я мог бы заставить это работать?

Ответы [ 2 ]

4 голосов
/ 31 декабря 2010

Особая проблема с GAE заключается в том, что он перенаправляет STDOUT в браузер, включая выходные данные отладчика.

Как указано в документации pdb , обычный рабочий процесс заключается в установке точки останова в кодев тот момент, когда вам это нужно.Обычно вы делаете import pdb; pdb.set_trace(), но в случае GAE вы также захотите захватить свой STDIN и STDOUT.Например, этот фрагмент кода:

def set_trace():
    import pdb, sys
    debugger = pdb.Pdb(stdin=sys.__stdin__, 
        stdout=sys.__stdout__)
    debugger.set_trace(sys._getframe().f_back)

Затем запустите оболочку в emacs и запустите ваш код оттуда:

$ ./bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/

Для быстрого доступа к нужному месту в взаимодействии с оболочкойбуфер в emacs, я использую poptoshell.el (Google, у меня недостаточно репутации, чтобы добавить еще одну ссылку)

Наконец, убедитесь, что у вас достаточно свежая версия python-mode, так что она включает pdbtrackфункциональность (вы почти наверняка это делаете, но вы определенно хотите ее, поскольку она предоставляет средства для пошагового выполнения кода в emacs).

1 голос
/ 31 декабря 2010

Попробуйте использовать pdb.set_trace() в своем коде, а затем вместо использования скрипта драйвера просто вызовите вашу программу как обычно (я думаю, что /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ должно работать в вашем случае.) Вы должны попасть в отладчик в точке, где вывызовите pdb.set_trace (), а затем оттуда вы можете добавить точки останова или что угодно еще.

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