エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】ipythonを用いたデバッグについて

【SPONSORED LINK】

最近、データサイエンスフェスhttps://lpc.zozo.jp/recontest/というイベントに参加した。内容としては、ゾゾタウンの過去ログより購買予測を立ててランキングを競うというもので、自分は38位で終わる事が出来た。(正確な順位は11月8日に発表されるとの事)

過去ログを解析するにあたり、ちょうどPythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理を読んでいた事もあり本に記載されている内容を活用して解析を行う事とした。その中で、ipythonを用いたデバッグ方法が記載されていたので忘れないようにメモしておく。

ちなみに、ipythonとはpythonインタラクティブモードの強化版みたいなものでタブ補完やオブジェクトの情報を参照したりと開発を行う上で便利な機能がてんこ盛のツールである。自分が開発を行う際は、左ターミナルにvimを立ち上げて、右ターミナルにipythonを起動という感じで使用している。
f:id:hatakazu93:20141020053728p:plain

本題のipythonを用いたデバッグについてなのだが、ipythonはpythonスクリプトを以下のコマンドにて起動をする事が出来る。

%run test.py

スクリプト起動後にエラーが発生すると例外がトレースバックされるが、その際に%debugコマンドを入力するとデバッガが起動して例外発生時点の呼び出しスタックフレームに踏み入る事が出来る。デバッガの起動後は、その関数スタックフレーム内のでのpythonコード実行やその時点のオブジェクトやデータの表示が可能である。

自分が使用する際は、
vimプラグインのquickrunにてスクリプトを実行
 →エラー発生。
②%runコマンドにてipythonでスクリプト実行
 →例外がトレースバック
③%debugコマンドにてデバッガ起動
 →オブジェクトやデータの確認
という流れにてデバッグを行っている。

デバッグを行う際は、デバッガコマンドを使用する事になる。コマンドはしばらく使用しないと忘れてしまいがちだが、hを打つとコマンドのリストが表示される。その為、hコマンドだけ忘れないようにしておけば何とかなると思われる。

コマンド 挙動
h(elp) コマンドのリストを表示
c(ontinue) プログラムの実行を再開
q(uit) デバッガの終了
b(reak) number 行番号numberにブレイクポイントを設定
s(tep) 呼び出し先の関数に入る
n(ext) 現在の行を実行し、同一レベルにある次の行を実行
u(p) 関数呼び出しスタック内を上がる
d(own) 関数呼び出しスタック内を下る
l(ist) 現在行とその前後の行を表示
w(here) 現在位置からの完全な関数スタックトレースを表示

なお、%runにてスクリプトを実行する際に最初からデバッガを起動して実行したい場合は-dオプションを付ける事によってデバッガモードで起動する。

%run -d test.py

Eclipse等のIDE環境を使用したデバッガと比べると習得するまでに時間が掛かるが、使いこなせるようになるとデバッグの時間を大幅に短縮する事が可能となる。慣れの問題だと思うので今後も活用していくようにしたい。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理