Personal tools

CUIベースなのに無駄にビジュアルなPython用デバッガ - pudb

by ats posted at 2010-02-09 11:05 last modified 2010-02-09 11:05

pudbは,CUI環境(つまりシェル)で動くGUIライクなデバッガ。Pythonには標準でpdbというデバッガがついてくるけど,コマンドラインベースでちょっと使い方が面倒だよね。pudbはpdbよりノリがいい。まあスクリーンショットを見てもらうのが早いかな。

CUIベースでGUIっぽいことをするというのは,レトロなノリだよなあ。でもCUIベースならシェルが動く環境ならどこでも動く,という利点もある。ローカルのPythonでもssh越しのPythonでも,シェル上なら同じように動くというのは嬉しい。

インストールは簡単。いつものごとくeasy_installを使って「$ easy_install pudb」でOK。デバッガを実行中,使い方が分からないときは「?」を押すとインストラクションが出てくる。

とりあえず覚えるべきコマンドは4つくらいかな。

  • s : ステップ実行(ステップイン)
  • n : ステップ実行(ステップオーバー)
  • c : 実行の継続
  • b : ブレークポイントを置く,消す

さて,デバッガが有効なのは開発の場面ばかりではない。入門者がデバッガを使うと,プログラミングの学習につながる。デバッガでコードを見つつ,変数などを確認しながら,プログラムの挙動を学べる,という利点がある。SDの木村明治さんの記事にも同じようなことが書いてあったな。逆に,Pythonの達人になるとデバッガを使わないらしいけど。僕もあまり使わないかな。

さて,試しにpudbを使ってPythonの簡単なプログラムの挙動を見てみよう。Pythonの機能の中でも比較的分かりづらい「デコレータ」がどのような動きをするのか,pudbを使ってソースコードを追いながら確認してみる。

まず,以下のソースをファイルに保存する(ファイル名はdectest.pyとしておく)。ちなみにこのコードは,inspectモジュールを使って関数の引数情報を取り出し,表示する,という簡単なプログラム。

#!/usr/bin/env python

import inspect from pudb import set_trace; set_trace()

def sessionmethod(func):

    f = func
    def wrapper(*params, **kwargs):
        arg = inspect.getargspec(func)
        print arg
        #if 's' in params[0] and 
        return func(*params, **kwargs)
    return wrapper

if __name__ == '__main__':

    @sessionmethod
    def foo(hoge, s=None):
        print "FOO!"
    foo(1, s=2)

上の方に「from pudb import set_trace; set_trace()」という行が見える。これがpudbを呼び出すおまじない。

次に,このコードを実行する。「$ python2.5 -m pudb.run dectest.py」というコマンドを入力すると,pudb上でコードを実行できる。早速pudbを使ってプログラムの実行状況を見ながら,コードを実行してみよう。

sessionmethod()関数の直下や,内包関数wrapper()の直下に「b」キーを使ってブレークポイントを設置してコードを実行してみよう。ステップイン,ステップオーバーを使い分けながら実行すると,デコレータがどのようなタイミングで呼ばれているのか目で確認できるはずだ。

このデコレータは関数の定義時に呼ばれる部分と,関数の呼び出し時に呼ばれる部分に分かれているんだけど,どのような仕組みになっているのか,よく分かると思う。

挙動が把握しにくいコードは,デバッガを使って動きを追って見ると,仕組みが理解しやすいのです。

Category(s)
python
The URL to Trackback this entry is:
http://coreblog.org/ats/cui-based-debugger-pudb/tbping

Re: CUIベースなのに無駄にビジュアルなPython用デバッガ - pudb

Posted by Dubhead at 2010-02-09 12:43
> CUIベースでGUIっぽいことをするというのは,

私はGUI以前のTurbo Cの頃を思い出しました。レトロ感には同意。

Re:CUIベースなのに無駄にビジュアルなPython用デバッガ - pudb

Posted by 初心者 at 2010-02-10 10:43
winxpのコマンドプロンプトで、easy_installを試みるが、「No module named termios」と出て失敗しました。

Re:CUIベースなのに無駄にビジュアルなPython用デバッガ - pudb

Posted by ats at 2010-02-10 11:01
>Dubheadさん
Turbo Cなつかしいですね:-)

>初心者さん
Pythonはどんなバージョンを使ってますか?
Windows上でのeasy_installを使ったモジュールの導入については,下記URLなどを参照してみるとよいかもしれません

http://morchin.sakura.ne.jp/effective_python/easy_install.html
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
コメントスパム避けのための認証文字列です

Captcha Image

Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。この記事を読んでいただくと,技術者としての人となりを分かってもらえるかも。
Webcore株式会社 代表取締役
Plone上で動く,オープンソースのBlog Product - COREBlog2を使って運用しています。

最近書いた原稿
最終回 Python 3.0座談会(動画つき) 2009-07-16
Python 3.0 Hacks 第6回 Pythonicな文字列フォーマットforamat()メソッド 2009-03-30
言語としての一貫性を重視したPython 3の進化 2009-02-20
Python 3が後方互換性を捨てても求めたもの 2009-02-02
Python 3.0 Hacks : 第0回 Pythonの2008-2009 2009-01-01
 
最近書いた本,Mook
みんなのPython 改訂版
Python使いはもちろん,プログラミングの初心者から,他言語からの移行組までご好評いただいているPythonの定番入門書の第2版です。Python 3.0を含む最新の情報について加筆を行い,より読みやすいように構成を大幅に見直しました。第一版をお持ちの方にもお役立ていただける内容になっています。
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
 

Powered by Plone, the Open Source Content Management System