web-dev-qa-db-ja.com

問題をデバッグするのに役立つPythonコードをステップ実行する方法は?

Java/C#では、コードを簡単にステップ実行して、問題の原因を追跡できます。IDEにより、このプロセスは非常にユーザーフレンドリーになります。

同様の方法でpythonコードをトレースできますか?

143
Blankman

はい!そのためにpdbというPythonデバッガーがあります!

pdb myscript.pyまたはpython -m pdb myscript.pyを使用して、pdbからPythonプログラムを起動できます。

その後、発行できるコマンドがいくつかあります。これらのコマンドは pdb ページに記載されています。

覚えておくと便利なものは次のとおりです。

  • b:ブレークポイントを設定します
  • c:ブレークポイントに到達するまでデバッグを続けます
  • s:コードをステップスルーします
  • n:次のコード行に移動します
  • l:現在のファイルのソースコードをリストします(デフォルト:実行中の行を含む11行)
  • u:スタックフレームを上に移動します
  • d:スタックフレームを下にナビゲートする
  • p:現在のコンテキストで式の値を出力します

コマンドラインデバッガを使用したくない場合、 Pydev のようないくつかのIDEにはGUIデバッガがあります。

209
user193476

Python Interactive Debugger 'pdb'を使用して

最初のステップは、Pythonインタープリターをデバッグモードにすることです。

A。コマンドラインから

pythonインタープリターのコマンドラインから実行する最も簡単な方法

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B。通訳内

モジュールの初期バージョンを開発し、それをより反復的に実験しながら。

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C。プログラム内から

大きなプロジェクトと長時間実行モジュールの場合、import pdbおよびset_traceを使用して、プログラム内からデバッグを開始できます。 ()このように:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __== '__main__':
    MyObj(5).go()

さらに内部に入るためのステップバイステップのデバッグ

  1. 次のステートメントを実行…“ n”(次)

  2. 最後のデバッグコマンドを繰り返します…を入力しますを入力します

  3. すべて終了...“ q”(終了)

  4. 変数の値を「…」で印刷…(印刷)

    a)p a

  5. “ c”で(Pdb)プロンプトをオフにする(続き)

  6. あなたがどこにいるかを見る…“ l”(リスト)

  7. “ s”でサブルーチンにステップイン…(ステップイン)

  8. 続行していますが、現在のサブルーチンの最後まで…“ r”(戻り)

  9. 新しい値を割り当てる

    a)!b = "B"

  10. ブレークポイントを設定する

    a)break linenumber

    b)break functionname

    c)break filename:linenumber

  11. 一時的なブレークポイント

    a)tbreak linenumber

  12. 条件付きブレークポイント

    a)改行番号、条件

注:**これらのコマンドはすべて** pdbから実行する必要があります

詳細な知識については、以下を参照してください。

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

43
akD

Pythonには「pdb」というモジュールがあります。 pythonスクリプトの先頭で

import pdb
pdb.set_trace()

そして、デバッグモードに入ります。 「s」を使用してステップを実行し、「n」を使用して「gdb」デバッガーで行うのと同様の次の行をたどることができます。

36
Senthil Kumaran

Python 3.7以降では、 breakpoint() 組み込み関数を使用してデバッガーに入ることができます。

foo()
breakpoint()  # drop into the debugger at this point
bar()

デフォルトでは、breakpoint()pdb をインポートし、 pdb.set_trace() を呼び出します。ただし、デバッグ動作は sys.breakpointhook() および環境変数 PYTHONBREAKPOINT を使用して制御できます。

詳細については、 PEP 55 をご覧ください。

10
Eugene Yarmash

ipdb(IPythonデバッガー)

ipdb はIPython機能をpdbに追加し、以下の大きな改善を提供します。

  • タブ補完
  • より多くのコンテキスト行を表示
  • 構文ハイライト

Pdgとほぼ同じように、ipdbはGDBと比較した場合、まだ完全ではなく、完全に初歩的なものですが、pdbに比べてすでに大幅に改善されています。

使用法はpdbに似ており、次のようにインストールするだけです。

python3 -m pip install --user ipdb

次に、デバッグをステップ実行する行に追加します。

__import__('ipdb').set_trace(context=21)

エディターからショートカットを追加したい場合があります。 for Vim snipmate

snippet ipd
    __import__('ipdb').set_trace(context=21)

したがって、単にipd<tab>と入力すると、ブレークポイントに展開されます。その後、ddを使用して簡単に削除できます。すべてが1行に含まれているためです。

context=21で説明されているように、コンテキスト行の数が増えます: デバッグ中にipdbにコンテキストの行を表示させるにはどうすればよいですか?

または、次の方法でプログラムを最初からデバッグすることもできます。

ipdb3 main.py

しかし、あなたは一般的にそれをしたくありません:

  • Pythonがこれらの行を読み取るときに、すべての関数とクラスの定義を実行する必要があります。
  • Ipdbをハッキングせずにコンテキストサイズを設定する方法がわかりません。許可するパッチ: https://github.com/gotcha/ipdb/pull/155

または、raw pdb 3.2+のように、コマンドラインからいくつかのブレークポイントを設定できます。

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

-c cは何らかの理由で壊れていますが: https://github.com/gotcha/ipdb/issues/156

python -m moduleのデバッグは: コマンドラインからPython -mで実行されるpythonモジュールをデバッグする方法? およびPython 3.7は次の方法で実行できるためです。

python -m pdb -m my_module

GDBと比較したpdbとipdbの両方の深刻な欠落機能:

ipdb特有の迷惑:

Ubuntu 16.04、ipdb == 0.11、Python 3.5.2。でテスト済み.

Java/C#のバックグラウンドから来た場合、 EclipsePydev を併用するのが最善の策だと思います。これにより、デバッガが組み込まれた完全に機能するIDEが提供されます。Djangoでも使用します。

3
Liorsion

統合デバッガでIDEが必要な場合は、 PyScripter を試してください。

2
kindall

PTVSを備えたVisual Studioはあなたのためのオプションです: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx

1
Aaron Hoffman

プログラムでpythonコードをステップ実行およびトレースすることもできます(そして簡単です!)。詳細については、 sys.settrace() のドキュメントをご覧ください。また、 here は開始するためのチュートリアルです。

1
Autodidact

https://wiki.python.org/moin/PythonDebuggingTools

pudbはpdbの優れたドロップイン代替品です

1
Neil

Python Tutor は、オンラインのシングルステップデバッガーです。 edit ページにコードを入力し、「実行の視覚化」をクリックして実行を開始できます。

0
wjandrea

PyCharmは、デバッガーを含むIDEのPythonです。 PyCharmのデバッガーを使用してコードをステップ実行する方法の概要については、このYouTubeビデオをご覧ください。

PyCharmチュートリアル-PyCharmを使用してpythonコードをデバッグする

注:これは、承認またはレビューを目的とするものではありません。 PyCharmは有料の商用製品ですが、同社は学生と教師に無料ライセンスを提供し、無料でオープンソースの「軽量」コミュニティバージョンも提供しています。

Screenshot

0
jim

現在、breakpoint()に代わるimport pdb; pdb.set_trace()メソッドがあります。

また、可能性のある環境変数など、 いくつかの新機能 があります。

0
johnnyheineken