Thursday, July 19, 2012

Automatic Debug Shell in Python

I've been working on a few long-running Python scripts lately. I find debugging to be difficult when a script takes a long time to run, since you don't get any feedback until execution hits the point in the code you're working on.

Python's awesome pdb module lets you drop into an interactive shell by calling the set_trace function. This is really useful because you can inspect local variables from the interactive shell. I found it tedious, though, to keep inserting these statements into my code, hoping it was in the right place, and wasting time when an exception was thrown somewhere other than what I was expecting.

I found a nice recipe that lets you drop into interactive mode as soon as an unhandled exception occurs. I created a gist that incorporates some changes from the comments. It only enters the interactive shell if the script has an appropriate TTY session, and if the exception is not a SyntaxError.

Here's an example script showing how to use it:
#test.py
import debug

def what():
   x = 3
   raise NotImplementedError()

if __name__ == '__main__':
   what()

And an example of using it:
$ python test.py 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    what()
  File "test.py", line 5, in what
    raise NotImplementedError()
NotImplementedError

> /home/jterrace/python-exception-debug/test.py(5)what()
-> raise NotImplementedError()
(Pdb) x
3

This is really nice for debugging, because it drops you to a shell that has all the local variables when the exception occurred.

Update
Yang pointed out the ipdb module. It looks awesome as an alternative to pdb and it comes with a method for doing this automatically.

1 comment:

  1. dongtam
    mu moi ra hom nay
    tim phong tro
    http://nhatroso.com/
    nhac san cuc manh
    tổng đài tư vấn luật
    http://dichvu.tuvanphapluattructuyen.com/
    văn phòng luật hà nội
    tổng đài tư vấn luật
    thành lập công ty trọn gói
    http://we-cooking.com/
    chém gió
    trung tâm ngoại ngữbao lâu nữa, ngươi vào không được.

    Tôn Quân cười nói.

    - Các ngươi cho rằng dễ dàng như vậy sao, ta suốt một trăm năm còn chưa có đột phá, cho nên đến xem Cực Viêm Chi Địa, không chừng có vận khí tốt.

    Trần Đào khẽ cười nói.

    - Vậy thì chúc mừng Trần Đào đại nhân sau khi vào Cực Viêm Chi Địa đột phá đến sáu sao Đấu Thánh.

    Vũ Văn Giác khẽ cười nói.

    - Chúng ta đi vào đi, hay là tiếp tục chờ.

    Vũ Văn Giác khẽ nói, đến cửa kết giới rồi, bọn họ còn chưa đi vào.

    - Chư vị đến Thần Hoàng Tộc, nào dám để chư vị chờ lâu, không phải là ta đã ra nghênh đón sao.

    Bên trong kết giới không gian chấn động, sau đó có hơn mười đạo thân ảnh đi ra, phía trước cũng

    ReplyDelete