0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DatabricksAdvent Calendar 2022

Day 16

DatabricksでPythonデバッガー(pdb)を使う

Last updated at Posted at 2022-11-04

以下の記事を訳していた時に気づきました。Python debugger(pdb)を使うことで、例外発生時の問題特定が容易になります。

翻訳済みサンプルノートブックはこちらです。

要件

Databricksランタイム11.2以降が必要となります。

サンプルノートブックのウォークスルー

Databricksノートブックにおけるpdbの使い方のサンプルを示します。

  • 最後の例外からデバッグするには%debugを使います。これは、予期しないエラーに遭遇し、原因をデバッグする際に役立ちます(pdb.pm()と似ています)。
  • 例外後(しかし、プログラム終了前)にインタラクティブなデバッガーを自動で起動するには%pdb onを使います。

これらのコマンドを使う際には、他のセルを実行する前にデバッガーの使用を停止する必要があることに注意してください。デバッガーを終了する方法はいくつかあります。

  • 実行中のセルを終了するためにcあるいはcontinueを入力
  • エラーをスローしコード実行を停止するためにexitを入力
  • 出力ボックスの隣にあるCancelをクリックしてコマンドをキャンセル

%debug : 事後のデバッグ

Databricksノートブックで%debugを使うには:

  1. 例外が起きるまでノートブックのコマンドを実行します。
  2. 新規セルで %debug を実行します。セルの出力エリアでデバッガーが動作を始めます。
  3. 変数を調査するには、入力フィールドに変数名を入力し Enter を押します。
  4. 以下のコマンドを用いることで、変数の調査の様に、コンテキストを切り替えたり他のデバッガータスクを行うことができます。デバッガーの完全なコマンドの一覧に関しては、pdb documentationをご覧ください。文字列を入力し、 Enter を押します。
    • n: 次の行
    • u: 現在のスタックフレームを抜けて1レベル上に移動
    • d: 現在のスタックフレームを抜けて1レベル下に移動
  5. このノートブックの最初のセルで説明した方法のいずれかでデバッガーを抜けます。
Python
class ComplexSystem1:
  def getAccuracy(self, correct, total):
    # ...
    accuracy = correct / total
    # ...
    return accuracy
  
class UserTest:
  def __init__(self, system, correct, total):
    self.system = system
    self.correct = correct
    self.total = 0 # 間違った合計を設定しています!
    
  def printScore(self):
    print(f"You're score is: {self.system.getAccuracy(self.correct, self.total)}")
  
test = UserTest(
  system = ComplexSystem1(),
  correct = 10,
  total = 100
)

test.printScore()

上のセルを実行すると例外が発生します。
Screen Shot 2022-11-05 at 8.13.49.png

デバッガーを起動します。

%debug

Screen Shot 2022-11-05 at 8.18.16.png

こちらにコマンドを入力していきます。
Screen Shot 2022-11-05 at 8.18.57.png

total0であることがわかります。
Screen Shot 2022-11-05 at 8.19.28.png

スタックトレースを1レベル上に上がります。
Screen Shot 2022-11-05 at 8.20.00.png

self.totalを確認すると0であることがわかるので、これが原因であることが判明しました。
Screen Shot 2022-11-05 at 8.20.37.png

cでデバッガーから抜けます。
Screen Shot 2022-11-05 at 8.21.49.png

%pdb on : 事前のデバッグ

Databricksノートブックで%pdb onを使うには:

  1. ノートブックの最初のセルで%pdb onを実行して自動pdbをオンにします。
  2. 例外が起きるまでノートブックでコマンドを実行します。インタラクティブなデバッガーが起動します。
  3. 変数を調査するには、入力フィールドに変数名を入力し Enter を押します。
  4. 以下のコマンドを用いることで、変数の調査の様に、コンテキストを切り替えたり他のデバッガータスクを行うことができます。デバッガーの完全なコマンドの一覧に関しては、pdb documentationをご覧ください。文字列を入力し、 Enter を押します。
    • n: 次の行
    • u: 現在のスタックフレームを抜けて1レベル上に移動
    • d: 現在のスタックフレームを抜けて1レベル下に移動
  5. このノートブックの最初のセルで説明した方法のいずれかでデバッガーを抜けます。

pdbをオンにします。

%pdb on

Screen Shot 2022-11-05 at 8.22.52.png

Python
class ComplexSystem2:
  def getAccuracy(self, correct, total):
    # ...
    accuracy = correct / total
    # ...
    return accuracy

system = ComplexSystem2()

## テストのカバレッジ
print("Tests")
print(system.getAccuracy(10, 100) == 0.1)
print(system.getAccuracy(10, 0), 0)

例外が発生すると、自動でデバッガーが起動します。
Screen Shot 2022-11-05 at 8.23.41.png

上と同じ様にデバッグすることができます。
Screen Shot 2022-11-05 at 8.25.01.png

Databricks 無料トライアル

Databricks 無料トライアル

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?