📝
Pythonのデバッグ方法
- 1.1. ステップ 1: プリントステートメントを使う
- 1.2. ステップ 2: Python の組み込みデバッガ(pdb)を使う
- 1.3. pdb の基本コマンド
- 1.4. ステップ 3: 外部デバッガツールの使用
- 1.5. ステップ 4: ロギングを使う
- 1.6. ステップ 5: ユニットテストを活用する
- 1.7. プロファイリングでパフォーマンスの問題を見つける
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. 基本的な使い方
- コード内に
import pdb; pdb.set_trace()
を挿入します。 - プログラムを実行すると、挿入した箇所で実行が一時停止します。
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)のデバッガ
- VSCode で Python ファイルを開く。
- 左側のサイドバーから「デバッグ」アイコンをクリック。
- 「launch.json」ファイルを設定します。初めての場合は自動的に生成される。
- ブレークポイントを設定したい行の左側をクリック。
- 上部の「デバッグの開始」ボタンをクリックして、デバッグを開始。
1.4.2. PyCharm のデバッガ
- PyCharm でプロジェクトを開きます。
- デバッグしたい行の左側にあるグレーの領域をクリックして、ブレークポイントを設定します。
- 上部の「デバッグ」ボタンをクリックして、デバッグを開始。
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
というプロファイラが組み込まれています。
cProfile
の使用例
1.7.1. import cProfile
def my_function():
# ここにコードを記述
pass
cProfile.run('my_function()')
プロファイル結果を分析することで、どの部分のコードが時間を消費しているかを特定できる
参考にした記事(いつもありがとうございます)
Discussion