このサイトについて

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

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

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」キーを使ってブレークポイントを設置してコードを実行してみよう。ステップイン,ステップオーバーを使い分けながら実行すると,デコレータがどのようなタイミングで呼ばれているのか目で確認できるはずだ。

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

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

2010-08-27 04:53