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


186

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

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

回答:


264

はい!そのpdbためだけに呼び出されたPythonデバッガがあります。

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

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

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

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

コマンドラインデバッガーを使用しない場合は、PydevWing IDE、またはPyCharmなどの一部のIDEにGUIデバッガーがあります。WingとPyCharmは商用製品ですが、Wingには無料の「パーソナル」エディションがあり、PyCharmには無料のコミュニティエディションがあります。


10
うわー、linux / ubuntuのグラフィカルなpdbを見つけるのに苦労しているとは思えません。何か不足していますか?そのためのSublimeTextプラグインの作成を検討する必要があるかもしれません。
ThorSummoner 2014

4
PyCharmはグラフィカルデバッガとしてはかなり優れており、そのCommunity Editionは無料です!
Pieter

@ThorSummoner、pudbそのために素晴らしいです。またpydev
alpha_989

pdbコマンドラインツールではありません。使用するには、を使用しますpython -m pdb your_script.py
jdhao 2018年

@jdhao標準ではないと思いますが、Ubuntuではpdbコマンドはpythonパッケージの一部です。いずれにしても、python -m <module>はのような他のものの標準になっているpipので、デフォルトでそれを使用するのがおそらく最善です。
wjandrea

55

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 pdbset_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 __name__ == '__main__':
    MyObj(5).go()

ステップバイステップのデバッグにより内部へ

  1. 次のステートメントを実行… 「n」(次へ)

  2. 最後のデバッグコマンドを繰り返す… ENTER

  3. すべて終了する… 「q」(終了)

  4. 変数の値を出力する…“ p”(出力)

    a) pa

  5. (Pdb)プロンプトをオフにする… 「c」を押して(続行)

  6. 現在地を確認しています… 「l」(リスト)

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

  8. 継続しています…しかし、現在のサブルーチンの終わりまで… "r"(リターン)

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

    a) !b = "B"

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

    a) 改行番号

    b) 関数名を壊す

    c) ファイル名を改行する:行番号

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

    a) tbreak行番号

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

    a) ブレーク行番号、条件

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

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

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

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


41

Pythonには 'pdb'というモジュールがあります。あなたが行うPythonスクリプトの一番上で

import pdb
pdb.set_trace()

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


21

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

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

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

詳細については、PEP 553を参照してください。


2
私が見たとき、breakpoint私は興奮していました。しかし、それは本質的にそれが単なるショートカットでimport pdb; pdb.set_trace()あり、それが私を悲しくさせたことを学びました。Python開発者:コンテキスト行、永続的なコマンド履歴、タブの自動補完などの基本的なGDB機能でPDBを改善することに集中してください:-)
Ciro Santilli郝海东冠状病六四事件法轮機能

11

ipdb(IPythonデバッガー)

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

  • タブ補完
  • コンテキスト行をさらに表示
  • 構文ハイライト

pdgと同様に、ipdbは、GDBと比較した場合、まだ完全ではなく完全に初歩的ではありませんが、すでにpdbを大幅に改善しています。

使い方はと似ていますがpdb、次のようにインストールするだけです。

python3 -m pip install --user ipdb

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

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

エディタからショートカットを追加したいと思うかもしれません。たとえば、私が持っている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でテスト済み。



3

あなたがJava / C#のバックグラウンドから来ているなら、私はあなたの最善の策はEclipsePydevで使用することだと思います。これにより、デバッガが組み込まれた完全に機能するIDEが得られます。私はdjangoでも使用しています。




2

Python Tutorは、初心者向けのオンラインシングルステップデバッガです。編集ページにコードを入力し、[実行の視覚化]をクリックして実行を開始できます。

特に、以下をサポートします。

ただし、次のような多くのことはサポートされていません

  • ファイルの書き込み/読み出し-使用io.StringIOし、io.BytesIO代わりに:デモ
  • 大きすぎるコード、実行時間が長すぎるコード、または定義する変数またはオブジェクトが多すぎるコード
  • コマンドライン引数
  • argparse、csv、enum、html、os、struct、weakrefなどの多くの標準ライブラリモジュール...

1

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



1

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

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

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

スクリーンショット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.