2010-12-27 17 views
7

napisałem to na programmers.stackexchange.com, ale pomyślałem, że może być bardziej odpowiednie na SO.Emacs: metody debugowania pytona

używam emacs dla wszystkich moich edycji kodu potrzeb. Zazwyczaj użyję kompilacji Mx do uruchomienia mojego testu, który powiedziałbym, że dostaję około 70% tego, co muszę zrobić, aby kod był na bieżąco, ale ostatnio zastanawiałem się, w jaki sposób można użyć Mx pdb na okazje, w których miło byłoby trafić w punkt przełomowy i sprawdzić rzeczy.

W moim googling znalazłem some things, które sugerują, że jest to użyteczny/możliwe. Jednak nie udało mi się go uruchomić w sposób, który w pełni rozumiem.

Nie wiem, czy jest to połączenie buildout + AppEngine, które mogą być utrudniając ale gdy próbuję coś zrobić jak

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/ 

Gdzie .../bin/python jest interpreter buildout robi ze ścieżką ustawioną dla wszystkich jaj.

~/bin/PDB jest prosty skrypt, aby zadzwonić do pdb.main użyciu bieżącego interpreter Pythona

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 jest skrypt dev_appserver że przepis buildout sprawia projektu gae i .../części/hydrant-app jest ścieżką do app.yaml

jestem pierwszy prezentowane z szybkiego

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

nic się nie dzieje, ale

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$ 

coś się dzieje

C-x [space] 

zgłosi, że punkt przerwania został ustawiony. Ale nie potrafię sprawić, że wszystko pójdzie dobrze.

Czuję, że brakuje tu czegoś oczywistego. Czy ja jestem?

Tak, jest interaktywny debugowanie w emacs opłaca? Czy możliwe jest interaktywne debugowanie aplikacji Google Appengine? Jakieś sugestie, jak mogę to osiągnąć?

+0

wyglądają tak: http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html – systempuntoout

+0

i tutaj http://code.google.com/p/googleappengine/issues/detail? id = 308 – systempuntoout

Odpowiedz

4

Specyficzny problem z GAE jest to, że przekierowuje STDOUT do przeglądarki, w tym wyjście debuggera.

Jak podkreślono w pdb documentation, zwykle pracy jest, aby ustawić punkt przerwania w kodzie w miejscu, gdzie jest to potrzebne. Zwykle robiłbyś import pdb; pdb.set_trace(), ale w przypadku GAE będziesz również chciał pobrać STDIN i STDOUT.Na przykład ten fragment kodu:

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

Następnie uruchom powłokę w emacs i uruchomić kod stamtąd:

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

dla łatwego dostępu do właściwym miejscu w buforze powłoki interakcji w emacs, Używam poptoshell.el (google to, nie mam wystarczającej reputacji, aby dodać inny link)

Wreszcie, upewnij się, że masz najnowszą wersję trybu Pythona taką, że zawiera ona funkcjonalność pdbtrack (prawie na pewno robisz , ale zdecydowanie tego chcesz, ponieważ zapewnia środki do st ep przez kod w emacs).

+0

ah to może być rozwiązanie. Będę musiał trochę się z tym pobawić, ale devappserver chwytający stdin/out, jak mówisz, może być powodem, dla którego pdb po prostu wisi dla mnie w emacs. dzięki za sugestię pdbtrack, nie zdawałem sobie z tego sprawy. –

+0

Nie mam jeszcze tego całkowicie działającego, ale to była zdecydowanie część układanki. –

1

Spróbuj użyć pdb.set_trace() w kodzie, a następnie zamiast używać skryptu sterownika wystarczy zadzwonić programu normalnie (myślę tylko /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ powinny działać w Twoim przypadku.) Powinieneś wpaść debuggera w momencie, gdy dzwonisz PDB. set_trace(), a następnie stamtąd można dodawać punkty przerwania lub cokolwiek innego w razie potrzeby.