Java/C#では、コードを簡単にステップ実行して、問題の原因を追跡できます。IDEにより、このプロセスは非常にユーザーフレンドリーになります。
同様の方法でpythonコードをトレースできますか?
はい!そのために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デバッガがあります。
最初のステップは、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()
さらに内部に入るためのステップバイステップのデバッグ
次のステートメントを実行…“ n”(次)
最後のデバッグコマンドを繰り返します…を入力しますを入力します
すべて終了...“ q”(終了)
変数の値を「…」で印刷…(印刷)
a)p a
“ c”で(Pdb)プロンプトをオフにする(続き)
あなたがどこにいるかを見る…“ l”(リスト)
“ s”でサブルーチンにステップイン…(ステップイン)
続行していますが、現在のサブルーチンの最後まで…“ r”(戻り)
新しい値を割り当てる
a)!b = "B"
ブレークポイントを設定する
a)break linenumber
b)break functionname
c)break filename:linenumber
一時的なブレークポイント
a)tbreak linenumber
条件付きブレークポイント
a)改行番号、条件
注:**これらのコマンドはすべて** pdbから実行する必要があります
詳細な知識については、以下を参照してください。
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
Pythonには「pdb」というモジュールがあります。 pythonスクリプトの先頭で
import pdb
pdb.set_trace()
そして、デバッグモードに入ります。 「s」を使用してステップを実行し、「n」を使用して「gdb」デバッガーで行うのと同様の次の行をたどることができます。
Python 3.7以降では、 breakpoint()
組み込み関数を使用してデバッガーに入ることができます。
foo()
breakpoint() # drop into the debugger at this point
bar()
デフォルトでは、breakpoint()
は pdb
をインポートし、 pdb.set_trace()
を呼び出します。ただし、デバッグ動作は sys.breakpointhook()
および環境変数 PYTHONBREAKPOINT
を使用して制御できます。
詳細については、 PEP 55 をご覧ください。
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
しかし、あなたは一般的にそれをしたくありません:
または、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。でテスト済み.
統合デバッガでIDEが必要な場合は、 PyScripter を試してください。
PTVSを備えたVisual Studioはあなたのためのオプションです: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
プログラムでpythonコードをステップ実行およびトレースすることもできます(そして簡単です!)。詳細については、 sys.settrace() のドキュメントをご覧ください。また、 here は開始するためのチュートリアルです。
https://wiki.python.org/moin/PythonDebuggingTools
pudbはpdbの優れたドロップイン代替品です
Python Tutor は、オンラインのシングルステップデバッガーです。 edit ページにコードを入力し、「実行の視覚化」をクリックして実行を開始できます。
PyCharmは、デバッガーを含むIDEのPythonです。 PyCharmのデバッガーを使用してコードをステップ実行する方法の概要については、このYouTubeビデオをご覧ください。
PyCharmチュートリアル-PyCharmを使用してpythonコードをデバッグする
注:これは、承認またはレビューを目的とするものではありません。 PyCharmは有料の商用製品ですが、同社は学生と教師に無料ライセンスを提供し、無料でオープンソースの「軽量」コミュニティバージョンも提供しています。
現在、breakpoint()
に代わるimport pdb; pdb.set_trace()
メソッドがあります。
また、可能性のある環境変数など、 いくつかの新機能 があります。