インタラクティブコンソールでPythonをデバッグする方法

前書き

*デバッグ*は、ソフトウェア開発プロセスの一部であり、プログラマーがソフトウェアを探して解決し、ソフトウェアの正常な実行を妨げる問題を解決します。

デバッグ用の便利で迅速なツールは、Python https://docs.python.org/3/library/code.html [+ code + module]です。これは、インタラクティブインタープリターをエミュレートするために使用できるためです。 このモジュールは、Pythonで記述したコードを試す機会も提供します。

`+ code +`モジュールを理解する

デバッガでコードをステップスルーするのではなく、https://www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3 [`+ code `モジュールを追加]をPythonに追加できますプログラムが実行を停止し、コードがどのように機能しているかを調べるために対話モードに入るように指示するプログラム。 ` code +`モジュールはPython標準ライブラリの一部です。

プログラミングファイルが提供できる複雑さと永続性を犠牲にすることなくインタープリターを活用できるため、これは便利です。 `+ code `モジュールを使用することにより、デバッグの形としてコード全体で ` print()+`ステートメントを使用することを避けることができます。これは時間とともに扱いにくくなる可能性があります。

デバッグの方法としてモジュールを使用するには、モジュールの `+ interact()+`関数を使用できます。この関数は、呼び出された時点でプログラムの実行を停止し、インタラクティブなコンソールを提供しますプログラムの現在の状態を調べることができます。

可能なパラメーターを持つ関数は次のとおりです。

code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

この関数はread-eval-printループを実行し、https://docs.python.org/3/library/code.html#code.InteractiveConsole [+ InteractiveConsole + class]のオブジェクトインスタンスを作成します。対話型Pythonインタープリターの動作。

オプションのパラメーターは次のとおりです。

  • `+ banner +`はhttps://www.digitalocean.com/community/tutorial_series/working-with-strings-in-python-3[string]に設定できるため、インタープリターの起動場所にフラグを立てることができます

  • + readfunc +`はhttps://docs.python.org/3/library/code.html#code.InteractiveConsole.raw_input [+ InteractiveConsole.raw_input()+`メソッド]として使用できます

  • `+ local +`は、インタープリターループのデフォルト名前空間を設定します

  • `+ exitmsg +`に文字列を設定して、インタープリターが終了する場所を記録できます

`+ local +`パラメータを使用すると、たとえば次のように使用できます。

  • ローカル名前空間の + local = locals()+

  • グローバル名前空間の場合は + local = globals()+

  • `+ local = dict(globals()、** locals())+`は、グローバル名前空間と現在のローカル名前空間の両方を使用します

`+ exitmsg `パラメーターはPython 3.6で新しく追加されているため、古いバージョンのPythonを使用している場合は、それを更新するか、 ` exitmsg +`パラメーターを省略してください。

プログラム内の任意の場所に、コード内の対話型インタープリターを起動するために、 `+ interact()+`関数を配置できます。

`+ code +`モジュールの使用

これを、「+ balances.py 」と呼ばれる銀行口座残高プログラムのコンテキストで見てみましょう。 名前空間をローカルに設定するには、 ` local `パラメーターを ` locals()+`に設定します。

balances.py

# Import code module
import code

bal_a = 2324
bal_b = 0
bal_c = 409
bal_d = -2

account_balances = [bal_a, bal_b, bal_c, bal_d]


def display_bal():
   for balance in account_balances:
       if balance < 0:
           print("Account balance of {} is below 0; add funds now."
                 .format(balance))

       elif balance == 0:
           print("Account balance of {} is equal to 0; add funds soon."
                 .format(balance))

       else:
           print("Account balance of {} is above 0.".format(balance))

# Use interact() function to start the interpreter with local namespace
code.interact(local=locals())

display_bal()

インタプリタループ内でデフォルトとしてローカル名前空間を使用するために、関数 `+ code.interact()`と ` local = locals()+`パラメータを使用しました。

仮想環境にない場合は `+ python3 `コマンドを使用し、次の場合は ` python +`コマンドを使用して、上記のプログラムを実行しましょう。

python balances.py

プログラムを実行すると、最初に次の出力が表示されます。

Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Pythonインタラクティブシェルの場合と同様に、カーソルは `+ >>> +`行の最後に配置されます。

ここから、変数、関数などを出力する呼び出しを発行できます。

>>>
409
>>>
[2324, 0, 409, -2]
>>>
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
None
>>>
<function display_bal at 0x104b80f28>
>>>

ローカル名前空間を使用することで、変数を出力して関数を呼び出すことができることがわかります。 最後の `+ print()`呼び出しは、コンピューターメモリ内の関数 ` display_bal +`の位置を示します。

インタプリタでの作業で確認できたことに満足したら、* nixベースのシステムでは `+ CTRL + D `を、Windowsベースのシステムでは ` CTRL + Z +`を押してコンソールを終了できます。そして、プログラムの実行を続けます。

プログラムの残りを実行せずにコンソールを終了したい場合は、 `+ quit()+`と入力することで終了でき、プログラムは中止されます。

`+ banner `および ` exitmsg +`パラメーターを活用するには、次のようにします。

balances.py

...
# Use interact() function to start the interpreter
code.interact(banner="Start", local=locals(), exitmsg="End")

display_bal()

プログラムを実行すると、プログラムの実行時に次の出力が表示されます。

Start
>>>

`+ banner `パラメータを使用すると、コード内に複数のポイントを設定し、それらを特定できるようになります。 たとえば、[for-loop](https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-pythonで「」を出力する「+ banner 」を使用できます-3) "`と `+ exitmsg `を組み合わせて、 `" Out of for-loop "+`を出力するため、コードのどこにいるかを正確に知ることができます。

ここから、通常どおりインタプリタを使用できます。 「+ CTRL + D +」と入力してインタープリターを終了すると、終了メッセージが表示され、関数が実行されます。

End
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.

これで、プログラムは対話型セッションに続いて完全に実行されました。

`+ code `モジュールを使用してコードをデバッグしたら、プログラムが通常どおり実行されるように、 ` code `関数とimportステートメントを削除する必要があります。 ` code +`モジュールはユーティリティを提供するため、完了したら自分でクリーンアップすることが重要です。

結論

`+ code `モジュールを使用してインタラクティブコンソールを起動すると、コードの動作をきめ細かく見て、その動作を理解し、必要に応じて変更を加えることができます。 詳細については、https://docs.python.org/3/library/code.html [ code + `モジュールの公式ドキュメント]を参照してください。

Pythonコードのデバッグに使用できる他の方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-the-python-debugger [Pythonの使用方法]のチュートリアルをご覧ください。デバッガー + pdb +]、およびhttps://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3 [ロギングの使用方法]のチュートリアル。