PyCharmでデバッグを行う方法

間違いのないコードを書くには、とにかく「しつこくデバッグを行うこと」が必要です。うまく結果が出たと思っても、デバッガーで必ず途中過程を確認します。

そのためプログラミングには、デバッグしやすく、デバッグから情報を得やすい環境が必要です。PyCharmをオススメする理由の1つは、使いやすいデバッグインターフェースがあるからです。

デバッグがプログラミングに欠かせないのは、以下の3つが可能になるからです。

  1. 指定した行でプログラムを一時停止できる(ブレークポイントの配置)
  2. 一時停止した行の変数の値を確認できる
  3. 一時停止の後、プログラムを1行ずつ確認しながら続行できる(ステップ実行)

すなわち、プログラムの実行プロセスを詳細に確認できます。だから、デバッグを繰り返すと、プログラミングの理解も深まります。プログラミングの上達はデバッグなくしてありえません。

今回は、PyCharmを用いた一般的なデバッグの方法Windows版で説明します。

この記事の目次

バグとエラーは区別して考えてください

バグとはプログラマによるプログラム上の「間違い」です。例えば、計算結果が期待した値と違う場合です。原因をデバッガーを使用して明らかにし、修正(デバッグ)します(バグ=虫を除去ともいいます)。

一方、エラーは大抵ユーザーによって引き起こされます。例えば、数値を入力すべき箇所に文字列を入力してしまう場合です。入力が正しいかをチェックして、適切に処理するコードを追加します。

このように、「バグは修正、エラーは処理」と区別して理解してください。なお、バグがエラーを発生させる場合がありますが、これは「コードの間違い」なのでバグです。

サンプルコードの準備

1. PyCharmで新しいプロジェクトを作成

まずPyCharmを起動して、以下の画面でCreate New Projectをクリックします。

pycharm create project

前回作業したプロジェクトが表示される場合は File ▶ Close Project を選択すると上記画面が表示されます。起動時の画面を変更する方法は、以下のページを参考にしてください。

PyCharmの起動時に表示されていた以下のウィンドウ(Welcome Screen)が表示されなくなった場合、再度表示するようにする方法です。 Fileメニュー から Setting …

次に、Demoという名前のプロジェクトを作成します。以下の画面で Location: のフォルダー名にDemoを入力します。

▼ Project Interpreter をクリックして画面を展開し、今回は仮想環境を使用しないので、Existing interpreter の方をチェックします。Interpreter: ではPython3.*(ここではPython3.6)を選択してください。

pycharm project interpreter

最後に Create をクリックすればプロジェクトが作成されます。

2. サンプルコードの作成

画面の左側の Project の部分で、Demoを選択した状態で、Alt + Insert で以下のようにファイル新規作成ダイアログが表示されので、Python File を選択してください。

pycharm create file

以下のダイアログが表示されるので、debug_demoと入力して OK をクリックしてください。

pycharm create debug file

debug_demo.py のエディターが開くので、以下のコードを入力してください。このプログラムは入力した値(n)に対して、1 + 2 + 3 +···+ n を計算するプログラムです(いわゆる等差数列の和を計算します)。

def sigma(n):
    z = 0
    for i in range(1, n):
        z = z + i
    return z


def main():
    n = int(input('n = '))
    result = sigma(n)
    print(result)


main()

注意:上記のコードにはバグがあります

すぐに判ったかもしれませんが、上記のコードにはミスがあります。デバッガーを使いながらその原因を探ります。

エディターに入力した様子は、以下のようになります。

pycharm file editor

デバッグの開始方法

左のプロジェクトの部分で、debug_demo.pyを右クリックしてメニューを表示して、Debug 'debug_demo'を選択します。

pycharm debug start

すると以下のように、デバッグ ツール ウィンドウ が開きコンソールタブが表示されて、デバッグモードになります。

pycharm debug session start

実際に以下のように値を入力してみます。プログラムは完了し、デバッグモードも終了します。

pychar debug end

上記の計算では、n=3 の答えは 3 と出力されましたが、正しくは

n = 3 の時、 1 + 2 + 3 = 6

と出力されなければなりません。すなわち、このプログラムにはバグがあります。以下でその原因を調べます。

次回からはデバッグボタンを利用できます

上記の方法で一度デバッグを実行すると、実行/デバッグプロセスが登録されます。ここでは、debug_demo.pyのデバッグなので、dubug_demoというプロセス名が登録されます。他のPythonファイルをデバッグすれば、別のプロセス名が追加登録されます。

一度プロセスが登録されれば、以下のように対象のプロセス名を選択した状態で、虫マークデバッグ開始ボタンをクリックすればデバッグを簡単に開始できます。

pycharm debug proceess

デバッグの手順(ブレークポイントの設置 ▶ ステップ実行)

一般的なデバッグは、「ブレークポイントによる停止」と「ステップ実行」の2つをうまく駆使して行います。ここはサンプルコードを用いてバグを見つけながら以下の順序で説明します。さらに、PyCharmの便利なデバッグ機能として、途中から対話モードで確認する方法についても説明します。

  1. ブレークポイントの配置
  2. デバッグの開始
  3. 次のブレークポイントへ移動
  4. ステップ実行で1行ずつ確認

1. ブレークポイントの配置

まずプログラムを一時停止したい箇所にブレークポイントを配置します。

以下のようにコードと行番号の間の部分(ガーター)をクリックするとブレークポイント(赤丸)が配置されます。今回は以下の2箇所に配置します。

pycharm set breakpoint

2. デバッグの開始

この状態でデバッグ開始ボタンをクリックして、デバッグを開始します。

次に Consoleタグに3を入力してEnterを押します。すると、最初のブレークポイントで一時停止します。

pycharm stop breakpoint

9行目のnの入力待ちを表すコードの末尾に、n:3 と表示されています。これは、nには3が代入されていることを示しています。

このようにデバッグ中は、現在の変数の値が、行中に表示されますインライン デバッギングと呼ばれます)。

3. 次のブレークポイントへ移動

以下のように、左端にある矢印のResume(回復)ボタンをクリックすると、次のブレークポイントに移動します。

pycharm move breakpoint

4. ステップ実行で1行ずつ確認

ここからは、1行ずつ実行しながら確認します。

以下のようにStep Overボタンをクリックして、プログラムを1行進めます。for文の箇所で、i1が代入されたのが確認できます。

pycharm debug step 1

さらにStep Overボタンを2回クリックしてみます。

1回目でfor文に戻り、2回目でまたz = z + i の演算に進みます。

このように、繰り返し処理を1ステップずつ確認することができます。i2になっているので、2回目の繰り返し処理であることがわかります。

pycharm debug step 2

続いて、もう2回Step Overボタンをクリックしてみます。

1回目でfor文に戻りますが、2回目でz = z + i を演算しないで、for文を抜け出してしまいました。

pycharm debug step 3

すなわち、1 + 2 + 3 と計算するところを、1 + 2 までしか計算していません。バグが判明しました。繰り返す回数が1回足りないので、以下のように修正します。

def sigma(n):
    z = 0
    # nをn+1に修正
    for i in range(1, n+1):
        z = z + i
    return z
以下略

このように、ブレークポイントとステップ実行をうまく利用してデバッグを行います。

途中から対話モードで確認すると便利!

Pycharmの便利なデバッグ機能として重宝するのが、プログラムを一時停止した状態で、対話モード(インタラクティブモード)を実行できることです。

以下のようにプロンプトボタンをクリックすると対話モードが開始します。

pycharm debug intermode

プログラムを一時停止した時点の変数をそのまま利用できます。

この例では、nには3が代入されている状態でコードを試すことができます。以下のコードにより、range(1, n)では2回しか繰り返し演算しないことがわかります。

pycharm degub intermode

対話モードを終了する場合は、もう一度プロンプトボタンをクリックします。exit()を入力するとプログラム自体が途中で終了するので気をつけてください。