62961


Google Colaboratoryでのデバッグ、ステップインなどのやり方がわかりません。  
PyCharmのように、ブレイクポイントを作ったり、F8でステップインはできないのでしょうか。  
常識的な内容なのか、検索してもヒットしません。  
よろしくお願いします。


CC BY-SA 4.0
2020-02-11T09:15:46.723
62955
2020-02-11T15:24:32.663
2020-02-11T15:24:32.663
19110
37795
question
python jupyter-notebook google-colaboratory
Google Colaboratoryでのデバッグのやり方


通常 Google Colaboratory や（その元となっている）Jupyter Notebook
では、セルを分けることによって実行を途中で止めることができます。自分の体感的には、セル単位で止めつつ必要に応じて `print`
すれば事足りる場面が多いです。

しかしそれでもデバッガーが欲しくなる場合があるかもしれません。ここではふたつのやり方を紹介します。

## `%debug` magic

Jupyter (IPython) には組み込みで
[`%debug`](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-
debug) というマジックコマンドがあり、これを利用することができます。`%debug` は Python 標準のデバッグツールである
[pdb](https://docs.python.org/ja/3/library/pdb.html) を Jupyter
上で起動してくれます。`%debug`
には引数ありで使う場合と引数なしで使う場合があるのですが、私が便利だと思っているのは引数なしで使うものです。これは、何かしらエラーが出たあと、次のセルに
`%debug` と打ち込むとエラーが出た時点のスタックフレームからデバッガーを起動してくれます。

使えるコマンドは標準の pdb
と同じものです：<https://docs.python.org/ja/3/library/pdb.html#debugger-commands>

とりあえずは以下が分かれば基本的な操作ができると思います。

  * `h [command]`：ヘルプを出す
  * `p [expression]`：式を評価して出力する
  * `n`：次の行へ
  * `c`：次のブレークポイントへ
  * `q`：その場で終了する

実行例です：

[code]

    def harmonic(n):
      acc = 0
      for i in range(n):
        acc += 1.0 / i
      return acc
    print(harmonic(10))
    
[/code]

[code]

    ---------------------------------------------------------------------------
    ZeroDivisionError                         Traceback (most recent call last)
    <ipython-input-5-fc532000561a> in <module>()
          4     acc += 1.0 / i
          5   return acc
    ----> 6 print(harmonic(10))
    
    <ipython-input-5-fc532000561a> in harmonic(n)
          2   acc = 0
          3   for i in range(n):
    ----> 4     acc += 1.0 / i
          5   return acc
          6 print(harmonic(10))
    
    ZeroDivisionError: float division by zero
    
[/code]

[code]

    %debug
    
[/code]

[code]

    > <ipython-input-5-fc532000561a>(4)harmonic()
          2   acc = 0
          3   for i in range(n):
    ----> 4     acc += 1.0 / i
          5   return acc
          6 print(harmonic(10))
    
    ipdb> p acc
    0
    ipdb> p i
    0
    ipdb> q
    
[/code]

更に
[`%pdb`](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-
pdb) を使うと、エラーが起きたところで自動的に（`%debug` を打ち込まずに）pdb が起動するよう設定することもできます。

## `Pdb().set_trace()`

また、もう少し手作業で、[`IPython.core.debugger.Pdb`](https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.debugger.html#IPython.core.debugger.Pdb)
を使うことによってブレイクポイントを作ることができます。ブレイクポイントを置きたい行に次のプログラムを挿入します。

[code]

    from IPython.core.debugger import Pdb; Pdb().set_trace()
    
[/code]

するとプログラムがこの行に到達した際に pdb の REPL が起動し、コマンドを打ち込みながらデバッグできます。

具体例です：

[code]

    def harmonic(n):
      acc = 0
      for i in range(n):
        from IPython.core.debugger import Pdb; Pdb().set_trace()
        acc += 1.0 / i
      return acc
    print(harmonic(10))
    
[/code]

[code]

    > <ipython-input-8-8f37e64adc73>(5)harmonic()
          3   for i in range(n):
          4     from IPython.core.debugger import Pdb; Pdb().set_trace()
    ----> 5     acc += 1.0 / i
          6   return acc
          7 print(harmonic(10))
    
    ipdb> p acc
    0
    ipdb> p i
    0
    ipdb> c
    ---------------------------------------------------------------------------
    ZeroDivisionError                         Traceback (most recent call last)
    <ipython-input-8-8f37e64adc73> in <module>()
          5     acc += 1.0 / i
          6   return acc
    ----> 7 print(harmonic(10))
    
    <ipython-input-8-8f37e64adc73> in harmonic(n)
          3   for i in range(n):
          4     from IPython.core.debugger import Pdb; Pdb().set_trace()
    ----> 5     acc += 1.0 / i
          6   return acc
          7 print(harmonic(10))
    
    ZeroDivisionError: float division by zero
    
[/code]


CC BY-SA 4.0
2020-02-11T11:01:12.063
62961
2020-02-11T11:01:12.063
19110
62955
answer