Pythonをデバッグするにはどうすればよいですか?

青灯夜游
リリース: 2020-09-17 16:13:24
オリジナル
16329 人が閲覧しました

プログラムを一度書いて正常に実行できる確率は非常に低く、基本的には 1% を超えません。修正が必要なさまざまなバグが常に存在します。いくつかのバグは非常に単純です。エラー メッセージを見ればわかります。いくつかのバグは非常に複雑です。エラーが発生したときにどの変数が正しい値を持ち、どの変数が間違った値を持っているかを知る必要があります。したがって、次のことが必要です。プログラムをデバッグし、バグを修正するための手段の完全なセット。 Pythonのデバッグ方法については以下の記事で紹介していますので、ご参考になれば幸いです。

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 zero
ログイン後にコピー

print を使用する最大の欠点は、後で削除する必要があることです。プログラムのどこにでもあり、実行結果にもスパムが大量に含まれます。


方法 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 である必要があります。そうでない場合、次のコードは間違った動作になります。


アサーションが失敗すると、assert ステートメント自体が AssertionError をスローします。

$ 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 / n
ログイン後にコピー

logging.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 = &#39;0&#39;
n = int(s)
print 10 / n
ログイン後にコピー

次に開始します:

$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<module>()
-> s = &#39;0&#39;
ログイン後にコピー

パラメータ -m を指定して pdb を起動した後、pdb は次に実行されるコード -> s = '0' を見つけます。コードを表示するには、コマンド l を入力します:

(Pdb) l
 1   # err.py
 2 -> s = &#39;0&#39;
 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
&#39;0&#39;
(Pdb) p n
0
ログイン後にコピー

コマンド q を入力してデバッグを終了し、プログラムを終了します:

(Pdb) n
ZeropisionError: &#39;integer pision or modulo by zero&#39;
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
(Pdb) q
ログイン後にコピー

pdb を使用してコマンド ラインでデバッグするこの方法は、理論的には万能ですが、実際には非常に面倒です。コードが 1,000 行ある場合は、最初のコードまで実行する必要があります。 999 行を入力するには、何個のコマンドが必要ですか?

概要

プログラムの作成で最も面倒なことはデバッグです。プログラムが予期しないプロセスで実行されることがよくあり、実行されると予想したステートメントが実行されません。現時点ではデバッグが必要です。

関連する学習に関する推奨事項:

Python チュートリアル

以上がPythonをデバッグするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート