📝

Pythonのデバッグ方法

2024/07/23に公開

1. 目的

Python のデバッグ方法についてまとめる

1.1. ステップ 1: プリントステートメントを使う

基本的なデバッグ方法は、コード内にprintステートメントを挿入して変数の値やプログラムの進行状況を確認。

1.1.1. 例

def add(a, b):
    result = a + b
    print(f"a: {a}, b: {b}, result: {result}")
    return result

add(2, 3)

1.2. ステップ 2: Python の組み込みデバッガ(pdb)を使う

Python にはpdbというデバッガが組み込まれている。
pdbを使うことで、コードの実行を一時停止し、変数の値を確認したり、ステップごとにコードを実行したりできる。

1.2.1. 基本的な使い方

  1. コード内にimport pdb; pdb.set_trace()を挿入します。
  2. プログラムを実行すると、挿入した箇所で実行が一時停止します。

1.2.2. 例

def add(a, b):
    import pdb; pdb.set_trace()
    result = a + b
    return result

add(2, 3)

1.3. pdb の基本コマンド

  • n(next):次の行に進む
  • c(continue):ブレークポイントまで続行
  • l(list):現在の行を含むソースコードを表示
  • p(print):変数の値を表示(例: p a

1.4. ステップ 3: 外部デバッガツールの使用

1.4.1. Visual Studio Code(VSCode)のデバッガ

  1. VSCode で Python ファイルを開く。
  2. 左側のサイドバーから「デバッグ」アイコンをクリック。
  3. 「launch.json」ファイルを設定します。初めての場合は自動的に生成される。
  4. ブレークポイントを設定したい行の左側をクリック。
  5. 上部の「デバッグの開始」ボタンをクリックして、デバッグを開始。

1.4.2. PyCharm のデバッガ

  1. PyCharm でプロジェクトを開きます。
  2. デバッグしたい行の左側にあるグレーの領域をクリックして、ブレークポイントを設定します。
  3. 上部の「デバッグ」ボタンをクリックして、デバッグを開始。

1.5. ステップ 4: ロギングを使う

printステートメントの代わりに、loggingモジュールを使うことで、デバッグ情報を記録し、より管理しやすくなる。

1.5.1. 例

import logging

logging.basicConfig(level=logging.DEBUG)

def add(a, b):
    logging.debug(f"a: {a}, b: {b}")
    result = a + b
    logging.debug(f"result: {result}")
    return result

add(2, 3)

1.6. ステップ 5: ユニットテストを活用する

ユニットテストを作成することで、コードの一部が正しく動作することを確認できます。これにより、バグを早期に発見しやすくなります。

1.6.1. 例

import unittest

def add(a, b):
    return a + b

class TestAddFunction(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)
        self.assertEqual(add(-1, 1), 0)

if __name__ == '__main__':
    unittest.main()

1.7. プロファイリングでパフォーマンスの問題を見つける

パフォーマンスの問題を見つけるには、プロファイリングツールを使用します。Python にはcProfileというプロファイラが組み込まれています。

1.7.1. cProfileの使用例

import cProfile

def my_function():
    # ここにコードを記述
    pass

cProfile.run('my_function()')

プロファイル結果を分析することで、どの部分のコードが時間を消費しているかを特定できる

参考にした記事(いつもありがとうございます)


GitHubで編集を提案

Discussion