Skip to content

Latest commit

 

History

History
179 lines (171 loc) · 16.5 KB

File metadata and controls

179 lines (171 loc) · 16.5 KB

PyCharmを使ってみよう(デバッグ入門編)


  1. ダウンロード
  1. インストール
  • ダウンロードしたdmgファイルをダブルクリック。
  • 「アプリケーション」フォルダに、ドラッグ&ドロップ。
  1. アプリの起動
  • 「アプリケーション」フォルダにある「PyCharm CE」を実行。
  1. 初期設定
  • PyCharm設定の引継ぎ確認
    • 今回が新規利用ならば、「Do not import settings(設定を引き継がない)」を選択して、OK。
    • もし過去に利用していて、設定が残っているならばその設定を保存したフォルダを指定しよう。
  • JetBrains Privacy Policy の確認
    • confirm -> OK
  • Data Sharingの確認
    • プラグインの資料履歴やソフトウェア設定、プロジェクト内のファイル数等の統計情報について、共有して構わないならば「Send Usage Statistics」を選択。共有したくないならば「Don't send」を選択。 *どちらでもOK。
  • Select keymap scheme
    • 好きな方を好みで選択。(デフォルトのままでOK)
  • Set UI theme
    • 好きな方を好みで選択。(デフォルトのままでOK)
  • Create Launcher Script
    • 「Create a script for opening files and projects from the command line」にチェックを入れて、Next。
  • Customize PyCharm
    • 「Markown」のみInstall。他も興味あるならお好みでどうぞ。
    • 「Start using PyCharm」をクリック。
  • Pythonインタプリタの設定
    • PyCharm CEが起動したら、左上のPyCharmメニューから「Preferences...」を選択。
    • 左パネルから「Project Interpreter」を選択。
    • 右パネルから「Project Interpreter 」を選択。
      • ここで「/anaconda3/bin/python」が見つかるなら、それを選択。
      • もし上記が見つからないなら、一番下の「+」ボタンをクリック。
        • 新しく出てきたウィンドウの、左パネルから「System Interpreter」を選択し、右端の「...」を選択。
        • ここで「/anaconda3/bin/python」を選択。
    • インタプリタとして「/anaconda3/bin/python」を選択したら、右下の「Apply」をクリックし、「OK」を選択。暫く環境設定が始まる。
    • 環境設定が終わると「Project Interpreter」ウィンドウに戻る。ここで「Python 3.7」が選択されていることを確認。大丈夫なら、右下の「OK」を選択。
    • この時点でPreferencesウィンドウに戻ってるはず。Project InterpreterとしてPython 3.7が選ばれていることを確認して、右下の「Apply」を選択。その後「OK」を選択。暫く環境設定が始まる。
  • PyCharmで利用するディレクトリを用意
    • (ターミナルを起動し、mkdir PycharmProjectsを実行。) *自動で用意されるはず。
  1. 単に新規プロジェクト作成してみる。
  • PyCharmを起動。
  • メニューから「Create New Project」を選択。
    • プロジェクトの保存先を確認。
    • プロジェクト名は、今回は「week8」にしよう。
    • インタプリタが「/anaconda3/bin/python」になっていることを確認しよう。
  • 上記を確認したら、「Create」。
    • 右下にprogress barが動いている間は、追加操作せずに待っておいた方が良い。
    • 左パネルは、Finderアプリのようにプロジェクトとして管理しているフォルダ全体を確認するためのパネル。
    • 右パネルは、ソースコード等を確認するためのパネル。
  • test.pyを作成してみよう。
  • 実行してみよう。

  • 今回の流れ
    • コード例を用意。
    • PyCharmで開く。
    • 通常実行してみる。
    • 設定無しでデバッグ実行してみる。
    • breakpointsを設定してデバッグ実行してみる。
  • コード例を用意。
    • コードをダウンロード。
      • github:python_demo_moduleへアクセス。
      • 右端にある「背景緑のClone or download」をクリック。
      • 「Doownload ZIP」をクリック。
    • 解凍して作業ディレクトリに移動。
      • ダウンロードしたファイル python_demo_module-master.zip を、ダブルクリックして展開(解答)する。
  • PyCharmで開く。
    • PyCharmを起動する。
    • 「Open」を選択し、先程展開したフォルダを開く。
      • 「~/Download/python_demo_module-master」として展開されているはず。このフォルダを選択して、右下の「Open」を選択。
        • 左パネルはFinder代わり。指定したフォルダに含まれるファイルやフォルダを参照するためのもの。
        • 右パネルはスクリプトファイル等、ファイルの中身を閲覧・編集するためのもの。
  • 通常実行してみる。
    • 実行したいファイルを開く。
      • 左側パネル「Project」から、python_demo_moduleを展開してファイル一覧を表示し、「import_case1.py」をダブルクリックして開こう。
    • Runメニューから「Run...」を選択。
      • 先程開いたファイルのモジュール名「import_case1」を選択。
        • 実行結果が下のパネルに出力されるはず。
        • 同じファイルを再実行するときは、右上の「右向き三角アイコン」をクリックするだけで良い。(ショートカットも用意されてるので調べてみよう)
  • 設定無しでデバッグ実行してみる。
    • Runメニューから「Debug 'import_case1'...」を選択するか、右上の「虫アイコン」をクリックしよう。これだけでデバッグ実行される。
    • 何も設定していない状態でデバッグ実行すると、トラブルが起きたときだけそこで一時停止する。何も問題ない場合には最後まで実行して終了する。
  • breakpointsを設定してデバッグ実行してみる。
    • デバッガが一時停止して欲しい場所をbreakpointと呼ぶ。今回は、import_case1.pyの3行目にbreakpointを設定してみよう。
      • breakpointの設定。
        • import_case1.pyを開いているウィンドウを眺めると、コードの左側に「灰色背景に行番号」が付与されているはずだ。行番号ではなく、「灰色背景」をクリックすることでbreakpointを付けたり、削除したりすることができる。なお、breakpointは複数箇所に設定することが可能。
        • 3行目にbreakpointを付けてみよう。
        • 一度breakpointを外して、もう一度付けてみよう。
    • breakpointを設定した状態でデバッグ実行してみよう。
      • breakpoint設定行が濃い青背景になり、一時停止した状態になるはずだ。
        • 濃い青背景でハイライトされてる箇所は、次に実行する行(まだ実行していない行) であることに注意。
    • 一時停止した状態から処理を続ける方法は、大別して3種類ある。
      • step over: 次の行に移動する。もし関数呼び出しの行なら、関数を実行し終えて次の行に移動して停止する。
      • step into: もし関数呼び出しなら、関数の中に移動して停止する。(関数ではないなら、単に次の行に移動する)
        • step into (ただのstep into): print()等の公式関数であっても、その関数内に移動する。
        • step into My Code: 自作関数の場合だけ移動する。
      • step out: その行を含む関数を呼び出しているところまで移動する。
    • ここでは、my_math.factR()関数の中に移動するために「step into My Code」を1度実行しよう。
      • Debugパネルの上部に、「↓➘➘➘➚➘」のようなアイコンが並んでいる箇所を探そう。この中の「左から3番目の➘(薄緑)アイコン」が、step into my codeのためのアイコン。これを1度クリックしよう。
        • 自動的にmy_math.pyファイルが開き、factR()関数の2行目で停止しているはずだ。
          • この時点で、RactR()の引数nは10であることが薄く表示されていることを確認できるはずだ。同様の結果が下部のdebugウインドウでも表示されている。
          • PyCharm等の一般的なIDEでは、行単位でのみ停止・処理をしていく。
      • スタックフレームの確認。
        • 関数が呼び出される都度、新しいスタックフレーム(局所変数を保存するための領域)が生成される。現状は、(1) 最初に import_case1.py を実行したスタックフレーム、(2) そこから factR() が呼び出されたスタックフレーム、の2つがあり、今は(2)にいるはずだ。
        • このことが「Framesパネル」の中では、以下のように示されている。今いる(2)のスタックフレームが「factR」として最上部にある。その1個下にある「 import_case11.py」が、(1)のスタックフレーム。さらにその下にあるのは、Pythonスクリプト実行時に自動的に読み込まれているプログラムであり、普段は意識する必要がない。
          • factR, my_math.py:2 *my_math.pyの2行目で一時停止中。
          • , import_case1.py:3 *import_case1.pyの3行目で関数呼び出し中。
          • execfile, _pydev_execfile.py:18
          • run, pydevd.py:1068
          • main, pydevd.py:1658
          • , pydevd:1664
        • 現状は、FramesパネルのfactR(スタックフレーム(2))にいて、そこに登録されている局所変数は「n = (int) 10」のみであることが確認できる。
        • 一つ前のスタックフレームを参照するには、Framesパネル内のひとつ下「, import_case1.py」をクリックしよう。そうすると、そのスタックフレームを所有している箇所にソースコードが移動し、どこから関数呼び出しをしているのか、また関数呼び出し当時の変数等を確認することができる。
          • 今回は、import my_math によりモジュール読込しているだけであり、それ以外の値はプログラム実行時の特別な値である。
    • step into 2回目
      • スタックフレームをfactRに戻そう。今はまだif文実行前である。
      • ここからもう一度step into my codeを実行すると、2行目の条件文が判定され、Falseとなるためにelseブロックに移動して停止するはずだ。
        • Thonnyだと評価結果を確認しながら進むが、一般的なIDEでは行単位で進むため、「どこに移動したか」から判断する必要がある。
    • step into 3回目
      • elseブロックの処理は「return n * factR(n-1)」である。
        • nは10に置き換えられる。
        • factR(n-1)は、引数が9と処理された状態で関数呼び出しを行う。つまり、factR(9)を実行しようとする。これは関数呼び出しのため、step into実行すると改めて関数の中に移動して一時停止する。
        • この時点で新しく関数呼び出しが実行されているため、新たなスタックフレームが生成されれている。Framesパネルをみると上から順に以下のように並んでいる(3つある)はずだ。
          • factR, my_math.py:2
          • factR, my_math.py:5
          • , import_case1.py:3
    • これ以降は基本的に同じ動作の繰り返し。ここではここで一旦停止しよう。
      • 今回は動作確認を省いた「step over」「step out」については、各自でやってみよう。(時間があれば別の機会にやります)

  • デバッグ実行で一時停止している間は、「今いくつのスタックフレームがあるのか」、「どの順番でフレームを生成したのか」、「今いるフレームはどこか」、「フレーム内の様子はどうなっているか」等の情報を確認することができる。
  • スタックフレームの確認。
    • step into 3回目の状態では、以下の3つのフレームが生成されている。
      • 「import_case1.pyを処理するためのフレーム」(最初のフレーム)
      • 「factR(10)を処理するためのフレーム」(2番目のフレーム)
      • 「factR(9)を処理するためのフレーム」(3番目のフレーム)
    • 現状
      • 3つのフレームが上記の順に作成された。スタックフレームは「スタックに積み上げる」ため、最初のフレームが一番下に、そこから2番目のフレームを積み上げ、今は3番目のフレーム factR(9) の中で停止している。
      • この様子はデバッグパネルの左下「MainThread」の下部に「逆順」に示されている。
        • 今いる3番目のフレームが「factR, my_math.py:2」。
          • my_math.pyの2行目、factRの中にいることが読み取れる。
          • このフレーム内に記録されてる変数は右側に表示されており、n=9であることが読み取れる。
    • フレームを移動して確認してみよう。
      • 一つ手前のフレーム(ここでは1回目のfactR呼び出し)の様子を確認したい場合、MainThreadで濃い青表示されてる一つ下のフレーム「factR, my_math.py:5」を選択すると良い。
        • my_math.pyの5行目、factRの中にいることが読み取れる。同時に、ファイル内では薄い青表示になっており、ここから先程のfactR()に移動したことが分かる。
        • このフレーム内に記録されてる変数は、n=10であることが読み取れる。
      • 更に一つ手前のフレーム(ここではimport_case1.py)の様子を確認したい場合、更にひとつ下のフレーム「, import_case1.py:3」を選択すると良い。
        • import_case1.pyの3行目にいることが読み取れる。
        • このフレーム内に記録されてる変数は「Special Variables」となっており、展開するとファイル名等が保存されていることが分かる。これらの値は、ファイル実行した際に保存されたもの。

  • デバッガは、終了するまで動き続けます。
    • よくある状況
      • デバッグ実行中にバグ要因に気づき、コードを修正。修正が正しく機能するか確認するために再度デバッグ実行。
        • この時点で2個のデバッガが並行して動いています。機能的には問題ありませんが、デバッガ起動する度にCPU, メモリ等のリソースを奪い続けることになります。
    • 適切な方法
      • デバッグ実行中にバグ要因に気づき、コードを修正。デバッガを終了させ、修正が正しく機能するか確認するために再度デバッグ実行。