ホームページ >バックエンド開発 >Python チュートリアル >Pythonをデバッグするにはどうすればよいですか?
プログラムを一度書いて正常に実行できる確率は非常に低く、基本的には 1% を超えません。修正が必要なさまざまなバグが常に存在します。いくつかのバグは非常に単純です。エラー メッセージを見ればわかります。いくつかのバグは非常に複雑です。エラーが発生したときにどの変数が正しい値を持ち、どの変数が間違った値を持っているかを知る必要があります。したがって、次のことが必要です。プログラムをデバッグし、バグを修正するための手段の完全なセット。 Pythonのデバッグ方法については以下の記事で紹介していますので、ご参考になれば幸いです。
#方法 1: print
print を使用して、問題がある可能性のある変数を出力します。この方法は最も簡単です。残忍さが効果的です。# err.py def foo(s): n = int(s) print '>>> n = %d' % n return 10 / n def main(): foo('0') main()実行後、出力内で出力された変数値を見つけます:
$ python err.py >>> n = 0 Traceback (most recent call last): ... ZeropisionError: integer pision or modulo by zeroprint を使用する最大の欠点は、後で削除する必要があることです。プログラムのどこにでもあり、実行結果にもスパムが大量に含まれます。
方法 2: アサート
表示を支援するために print が使用される場合は常に、代わりにアサーションを使用できます。
# err.py def foo(s): n = int(s) assert n != 0, 'n is zero!' return 10 / n def main(): foo('0')assert は、式 n != 0 は True である必要があります。そうでない場合、次のコードは間違った動作になります。
$ python err.py Traceback (most recent call last): ... AssertionError: n is zero!プログラムがアサートでいっぱいの場合、print よりも優れたものにはなりません。ただし、-O パラメータを使用すると、Python インタープリタの起動時にアサートをオフにすることができます。
$ python -O err.py Traceback (most recent call last): ... ZeropisionError: integer pision or modulo by zeroこれをオフにすると、すべてのアサート ステートメントをパスとして表示できます。
方法 3: ロギング
print をロギングに置き換えることもできます。アサートと比較して、ロギングはエラーをスローせず、ファイルに出力できます。 :# err.py import logging s = '0' n = int(s) logging.info('n = %d' % n) print 10 / nlogging.info() はテキストを出力できます。実行すると、ZeropisionError 以外の情報がないことがわかります。どうしたの?
import logging logging.basicConfig(level=logging.INFO)出力を参照してください:
$ python err.py INFO:root:n = 0 Traceback (most recent call last): File "err.py", line 8, in <module> print 10 / n ZeropisionError: integer pision or modulo by zeroこれはログの利点ですを使用すると、デバッグ、情報、警告、エラーなどのログ情報のレベルを指定できます。level=INFO を指定すると、logging.debug は機能しなくなります。同様に、level=WARNING を指定すると、debug と info が機能しなくなります。このようにして、さまざまなレベルの情報を削除せずに安全に出力でき、最終的にどのレベルの情報を出力するかを制御できます。 ロギングのもう 1 つの利点は、簡単な構成で、ステートメントをコンソールやファイルなどの異なる場所に同時に出力できることです。
方法 4: デバッガー pdb
Python デバッガー pdb を起動し、プログラムをシングルステップ モードで実行すると、いつでも実行ステータスを確認できます。まずプログラムを準備します:# err.py s = '0' n = int(s) print 10 / n次に開始します:
$ python -m pdb err.py > /Users/michael/Github/sicp/err.py(2)<module>() -> s = '0'パラメータ -m を指定して pdb を起動した後、pdb は次に実行されるコード -> s = '0' を見つけます。コードを表示するには、コマンド l を入力します:
(Pdb) l 1 # err.py 2 -> s = '0' 3 n = int(s) 4 print 10 / n [EOF]コードをシングルステップで実行するには、コマンド n を入力します:
(Pdb) n > /Users/michael/Github/sicp/err.py(3)<module>() -> n = int(s) (Pdb) n > /Users/michael/Github/sicp/err.py(4)<module>() -> print 10 / nコマンド p 変数名を入力すると、いつでも変数を表示できます。
(Pdb) p s '0' (Pdb) p n 0コマンド q を入力してデバッグを終了し、プログラムを終了します:
(Pdb) n ZeropisionError: 'integer pision or modulo by zero' > /Users/michael/Github/sicp/err.py(4)<module>() -> print 10 / n (Pdb) qpdb を使用してコマンド ラインでデバッグするこの方法は、理論的には万能ですが、実際には非常に面倒です。コードが 1,000 行ある場合は、最初のコードまで実行する必要があります。 999 行を入力するには、何個のコマンドが必要ですか?
概要
プログラムの作成で最も面倒なことはデバッグです。プログラムが予期しないプロセスで実行されることがよくあり、実行されると予想したステートメントが実行されません。現時点ではデバッグが必要です。関連する学習に関する推奨事項:
以上がPythonをデバッグするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。