私はPythonが好きで、Spyderは好きですが、Spyderでのデバッグはひどいものです!
解決策はありますか、pythonスクリプトと関数をデバッグする方法を教えてください。
Windows 8.1 64ビットでAnacondaの新規インストールを使用しています。
(Spyder dev here)Spyderでのデバッグエクスペリエンスは理想とはほど遠いことを認識しています。現在提供しているものは、標準のPythonデバッガーに非常に似ていますが、科学者がデバッガーに期待するものに近いものを提供するために、次のメジャーバージョンでの改善に取り組んでいます(要するに、現在のブレークポイントで変数を検査およびプロットできる通常のIPythonコンソール)。
あなたのポイントについて:
それは本当です。ユーザーが[実行]ボタンを押し、現在のファイルにブレークポイントが存在する場合、Spyderはデバッグモードに入り、最初のブレークポイントに到達するまでプログラムを実行するように改善することを考えています。
ipdb
はIPythonデバッガーコンソールです。残念ながら、IPythonアーキテクチャの制限により、非常に制限されています(コード補完も矢印による履歴参照もありません)。さらに、任意のPythonコードをipdb
または通常のpdb
コンソールで実行することはできません。 ipdb
で実行できるコマンドは、その中のhelp
コマンドを評価するときに読むことができるコマンドです。
私が言ったように、任意のPythonコードを評価できないからです。
Python/IPythonコンソールと同期されるように、エディターに新しいブレークポイントを配置する必要があります
実際には、 Pythonデバッガーpdb
と ipdb
の異なる統合を使用していることを理解する必要があります(これはpdb
を使用し、モジュール ipdb
を使用してアクセスできます) )。この些細な例が、あなたがそれをより良く使うのに役立つことを願っています。
このコードをデバッグするとします:
def Waiting_fun(): #1 line number one
for i in range(100): #2
pass #3
#4
def New_sum(lista, to_s = False): #5
result = 0 #6
print 1 #7
for i in lista: #8
print "summed" #9
result +=i #10
Waiting_fun() #11
if to_s: #12
result = str(result)
return result
a = New_sum([1,4,5,7,8])
b = New_sum([1,4],1)
c = 456
d = New_sum([6,8,9],1)
final_result = a*b*c*d
Out: Type error
%debug
最初に行うことは、マジックコマンド%debug
を使用してiPythonからpdbを呼び出すことです。これを%pdb
を使用してデフォルトのメカニズムとして設定できます。
%debug
> /home/opdate/Desktop/test.py(23)<module>()
19 a = New_sum([1,4,5,7,8])
20 b = New_sum([1,4],1)
21 c = 456
22 d = New_sum([6,8,9],1)
---> 23 final_result = a*b*c*d
pdb
を食べたら。すべてのコマンドは official docs で見つけることができますが、コマンドh
を使用して表示することもできます。この段階で使用するコマンドは次のとおりです。
p
:指定した変数を出力しますpp
:プリティプリントargs
:関数内にいる場合、引数を出力しますpp locals()
:すべての変数を印刷するのに役立ちますが、ほとんどの場合それは混乱です!!
は、h
にリストされているコマンドとの競合を避けたい場合に使用します。whatis
variable_name:type(variable_name)と同等u
:現在のフレームをスタックトレースで1レベル上に移動します(古いフレームに移動します)。d
:現在のフレームをスタックトレースで1レベル下に移動します(新しいフレームに移動します)。q
:終了したらqを使用して終了できます私たちの場合には:
ipdb> pp a,b,c,d
(25, '5', 456, '23')
またはipdb> !a,b,c,d
(感嘆符と最初の値の間にスペースがない)。 bとdが使用できる場合の文字列であることは明らかです。
ipdb> whatis b
<type 'str'>
70%の時間%debug
がソリューションを示しています。 breakpointsのような機能がさらに必要な場合は、Spyderを使用します。この場合、b
が文字列である理由を理解したいので、その隣にブレークポイントを配置します。デバッグにIPythonコンソールの代わりに標準のPythonコンソールを使用すると、はるかに優れたであるため、デバッグを開始する前にコンソールを選択します。
次に、変数が削除されている場合は、variable Explorer
を開きます。私が使う Ctrl+F5 デバッグを開始するには、上部のボタンを使用できますが、以下に示すショートカットを使用することを好みます。
(Pdb) c # we go to the breakpoint
(Pdb) s # we step into the function
(Pdb) args # we see what parameters are inserted
(Pdb) s # going step-by-step
(Pdb) ⏎ # series of Enters go line by line quicker
#Here I'll use whatis command but in fact I just look to
# the type in variable Explorer of spyder.
(Pdb) whatis result #check if result is still int
(Pdb) unt #or until -useful to exiting from loops see doc.
(Pdb) n # we don't enter to the Waiting_fun function
(Pdb) s # going step-by-step
(Pdb) whatis result #we find that there the int is converted
(Pdb) j 6 # for double checking we jump back to 6 were the result is assigned
# We may be tempted to j(ump) to line 12 but doing so we would skip all the code
#for avoiding a series of `s`,`unt` and `n` we can use this solution:
(Pdb) tbreak 12 #set a new temporary breakpoint. Also `b` it's ok most of the time
(Pdb) c # go to it
(Pdb) j 6 # we jump to 6 the code we jump is NOT executed
(Pdb) whatis result# we find that if we jump 12-13 result is still int
これでエラーが見つかりました。 ソリューションをテストすることもできます12までステップを繰り返し、to_s = False
を設定します
(Pdb) to_s = False #!to_s = False to be on the safe side
できます。 Pythonコンソールで標準pdbを使用する重要な機能の1つは、自動競合があり、whatis
およびpp
を使用する代わりに変数Explorerを使用できることです。
変数Explorerを使用して、変数の値を変更することもできます。
エラーを見つけるもう1つのより賢い方法は、条件付きブレークポイントを使用することです(Shift+F12)Spyderの大きな利点は、リストブレークポイントをデバッグして使用することです。条件がTrue
の場合、条件付きブレークポイントがアクティブになります。この場合、bが文字列になる場所を見つけたいので、条件はtype(b) == str
です。私は通常、多くの条件付きブレークポイントを配置し、どのブレークポイントが条件を満たすかを確認します。そうするために使用しないでください Shift+F12 ただし、通常のブレークポイントを行の横にダブルクリックして配置し、[デバッグ]-> [ブレークポイントの一覧表示]に移動して、下の図に示すようにテーブルの条件をすべてのブレークポイントにコピーして貼り付けます。
ここから使用するコマンドは次のとおりです。
(Pdb) c # go to the first
(Pdb) u # it helps to understand when it happened
(Pdb) d # come back to the breakpoint
Pdbデバッガーは、通常のpythonで問題なく動作します。したがって、Spyderでは、対話的にデバッグしたいときはいつでもpythonコンソールに切り替えます。
import pdb
def yourfunction():
# Interesting stuff done here
pdb.set_trace()
Pdbを使用したデバッグの概要 https://pythonconquerstheuniverse.wordpress.com/category/python-debugger/
明らかにこれらの2つについて誰も言及したことはありません。
Pythonの前は、VBAを使用していました。定期的に更新されていない比較的古い言語ですが、VBAで気に入っていたのはデバッグ機能です。 VBAに最も近い、または私が出会った「ビジュアルデバッグ」とも呼ばれる2つのデバッグ機能は次のとおりです。
1-PyCharmデバッガー
これ 6分のビデオでPyCharmデバッガーのデモをご覧ください。
2-PixieDebugger-ずっと欲しかったJupyterノートブック用のビジュアルPythonデバッガー
多くのコーダーはJupyterNotebookを使用する傾向があるため、このデバッガーが役立ちます。 PixieDebuggerはPyCharmデバッガーとほぼ同じです。ここでは詳しく説明しません。
しかし、あなたはこれを参照することができます link
IDEのフリーズを回避するために、Spyderでデバッグする方法を次に示します。デバッグモードでスクリプトを変更する場合、これを行います。
まだ少し迷惑ですが、変数リストをクリア(リセット)するという追加の利点があります。
ポイント3に関する1つの小さな追加事項:
また、デバッグコンソールは頻繁にフリーズ、印刷、評価などを行いましたが、停止(デバッグの終了)ボタンを押すと通常コールスタックの一番下に戻り、戻って(「u」)私がデバッグしていたフレームに。試してみる価値がある。これは、Spyderの新しいバージョン(2.3.5.2)の可能性があります
次のようなデバッグショートカットキーを使用できます。ステップオーバーF10 [ツール]> [設定]> [キーボードショートカット]