printデバッグ大変じゃないですか?Pythonで効率よくデバッグ、pdbの使い方

▼この記事をSNSでシェアする▼

スポンサーリンク

スポンサーリンク

santaka
Printデバッグは大変だ

コードで気になるところにprint(~)を何箇所も書くと、直したり色々面倒。

pdbをつかったデバッグのやり方は知っておくべきです。

メソッド内に移動していくのが便利だし、コンソール上での確認に柔軟性があるのがいいです。

事前準備

特に新しくパッケージを入れる必要はないです。

すでにPythonコマンドを実行できる環境があれば

Pythonがはいっていれば、pdbをimport・使用できるので・・・

pdbのコマンド

pdbを利用したデバッグでは、プログラムの特定の行で停止している最中に、

  • 特定の変数の内容をpコマンドで出力する
  • b 行番号を指定して、ブレイクポイントを設定する
  • n で次の行へ進む

などなど・・・コマンドを実行することでデバッグを進めます。

<主要なコマンド一覧>

p,s,c,b,hあたりは最低限押さえておきたい

最悪hが使えればなんとかなるか

sがEclipseでいうF5,cがEclipseでいうF8といったイメージです。

コマンド 意味 処理内容
h help コマンドのヘルプ表示、よくわからないときは多用しよう
b break ブレイクポイントを設定する。

第一引数は行番号

第二引数は関数、指定した場合関数の実行可能な最初の文にブレイクポイント設定

例:b 4 →4行目にブレイクポイントが設定される

tbreak 一時的なbreak bコマンドと引数は一緒、そこに到達すると、ブレイクポイントは削除される
cl clear ブレイクポイントの解除

第一引数はファイル名:行番号もしくはブレイクポイント番号のリスト

※引数の指定なし:全ブレイクポイント削除

disable disable break point 指定したブレイクポイントを無効にする
enable enable break point 指定したブレイクポイントを有効にする
s(tep) step in/ step over 現在の行を実行、呼び出された関数の中か現在の関数の次の行に進む
n(ext) step over 現在の関数の次の行に達するか、あるいは関数が返るまで実行を継続
r(eturn) returnまで実行  現在の関数が返るまで実行を継続
c(ont(inue))  break pointまで実行 次のブレイクポイント・pdb.set_trace()まで実行
 j(ump)  行を飛ばす  行番号指定でその行の処理を飛ばす

例:j 18→18行目の処理を飛ばす

l(ist) ソース表示 現在のファイルのソースコード表示
a(rgs) 引数表示 現在の関数の引数を表示
w(here) プログラムの実行過程の記録表示 スタックトレースを表示
p 変数・式を評価 現在の行での変数や式を評価する

例:

p x→x の値を評価

p x % 3 == 0→xが3で割り切れるかを評価

pp 変数・式を評価 pprintと用途は一緒

式の値以外はpprintモジュールを使用して “pretty-print” される

q(uit) デバッグの中断 デバッガーが終了になり、プログラムは中断される。

手順

2通りあります。

用途や好みは人によって個人差ありますが、個人的には後者の方が好きです。

python実行時に「-m pdb」を指定する

特定のファイルをデバッグしたい場合はこれでいいかもしれない。

という形でコマンドを実行すると、プログラムの最初の行で一時停止します。

n コマンドを実行し、最初の行から次の行に進めています。

p コマンドを使い「 p url」を使い変数の内容を評価できています。

「b 15」コマンドでブレイクポイントを設定し、「c」コマンドを実行し、15行目に処理を移動できています。

import pdb; pdb.set_trace()をコードに書く

上の方法だと、最初の行で止まってしまったり、デバッグしたい箇所が実行する対象のファイルではなく、そのファイルにするファイルである場合、移動するのが手間になります。

任意の場所でデバッグするにはその箇所に「import pdb; pdb.set_trace()」を追加するのが良いです。

python コマンドを実行後に、コードを追加した22行目の処理で一時停止しています。

そこでp user_infoを実行することでTwitter APIで取得した個々のユーザーの情報(json)を取得できていることが確認できています。

特定のオブジェクトのチェックの仕方

現在自分がつくっているアプリケーションでも使っているのですが、

p vars(特定のオブジェクト名)

でオブジェクト変数の中身を展開し、確認できます

まとめ

今回使ったpdbをWebアプリ開発にしろ機械学習にしろ処理の途中で意図した変数が表示できているのかを効率よく確認し、開発の質とスピードをアップを目指しましょう

スポンサーリンク


関連記事

▼この記事をSNSでシェアする▼

フォローする

メニュー・主な記事カテゴリ

おすすめ特集!




「ゆとり鳥日記」について
ITを中心に関心の赴くままに好きなように書いていく雑記ブログ!管理人が二人います。
◆フクロウ(ITコンサル)
◆santaka(SE)

詳しいプロフィール
お仕事の依頼・ご要望

ゆとり鳥日記をBTCで応援する