web-dev-qa-db-ja.com

Pythonのスパイダーで効率的にデバッグするにはどうすればよいですか?

私はPythonが好きで、Spyderは好きですが、Spyderでのデバッグはひどいものです!

  • ブレークポイントを設定するたびに、2つのボタンを押す必要があります。最初はデバッグボタン、次に続行ボタン(最初の行で自動的に一時停止します)です。
  • さらに、自動補完などを備えた標準のiPythonコンソールを使用するのではなく、単なるガベージであるお粗末なipdb >>コンソールがあります。
  • 最悪なのは、印刷物や簡単な評価を書いてバグとは何かを調べようとしても、このコンソールが頻繁にフリーズすることです。これはmatlabよりもはるかに悪いです。
  • 最後になりましたが、ipdb >>コンソール内から関数を呼び出し、そこにブレークポイントを設定しても、そこで停止しません。デバッグ(ctrl + F5)を開始する前にブレークポイントをそこに置く必要があるようです。

解決策はありますか、pythonスクリプトと関数をデバッグする方法を教えてください。

Windows 8.1 64ビットでAnacondaの新規インストールを使用しています。

60

Spyder dev here)Spyderでのデバッグエクスペリエンスは理想とはほど遠いことを認識しています。現在提供しているものは、標準のPythonデバッガーに非常に似ていますが、科学者がデバッガーに期待するものに近いものを提供するために、次のメジャーバージョンでの改善に取り組んでいます(要するに、現在のブレークポイントで変数を検査およびプロットできる通常のIPythonコンソール)。

あなたのポイントについて:

  1. それは本当です。ユーザーが[実行]ボタンを押し、現在のファイルにブレークポイントが存在する場合、Spyderはデバッグモードに入り、最初のブレークポイントに到達するまでプログラムを実行するように改善することを考えています。

  2. ipdbはIPythonデバッガーコンソールです。残念ながら、IPythonアーキテクチャの制限により、非常に制限されています(コード補完も矢印による履歴参照もありません)。さらに、任意のPythonコードをipdbまたは通常のpdbコンソールで実行することはできません。 ipdbで実行できるコマンドは、その中のhelpコマンドを評価するときに読むことができるコマンドです。

  3. 私が言ったように、任意のPythonコードを評価できないからです。

  4. Python/IPythonコンソールと同期されるように、エディターに新しいブレークポイントを配置する必要があります

43
Carlos Cordoba

デバッグのワークフロー

実際には、 Pythonデバッガーpdbipdb の異なる統合を使用していることを理解する必要があります(これは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

IPython%debugを使用したクイックファーストデバッグ

%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コンソールを使用すると、はるかに優れたであるため、デバッグを開始する前にコンソールを選択します。 enter image description here

次に、変数が削除されている場合は、variable Explorerを開きます。私が使う Ctrl+F5 デバッグを開始するには、上部のボタンを使用できますが、以下に示すショートカットを使用することを好みます。

enter image description here

(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を使用できることです。

enter image description here

変数Explorerを使用して、変数の値を変更することもできます。

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

エラーを見つけるもう1つのより賢い方法は、条件付きブレークポイントを使用することですShift+F12)Spyderの大きな利点は、リストブレークポイントをデバッグして使用することです。条件がTrueの場合、条件付きブレークポイントがアクティブになります。この場合、bが文字列になる場所を見つけたいので、条件はtype(b) == strです。私は通常、多くの条件付きブレークポイントを配置し、どのブレークポイントが条件を満たすかを確認します。そうするために使用しないでください Shift+F12 ただし、通常のブレークポイントを行の横にダブルクリックして配置し、[デバッグ]-> [ブレークポイントの一覧表示]に移動して、下の図に示すようにテーブルの条件をすべてのブレークポイントにコピーして貼り付けます。

enter image description here

ここから使用するコマンドは次のとおりです。

(Pdb) c  # go to the first
(Pdb) u # it helps to understand when it happened
(Pdb) d # come back to the breakpoint
20
G M

Pdbデバッガーは、通常のpythonで問題なく動作します。したがって、Spyderでは、対話的にデバッグしたいときはいつでもpythonコンソールに切り替えます。

import pdb

def yourfunction():
    # Interesting stuff done here
    pdb.set_trace() 

Pdbを使用したデバッグの概要 https://pythonconquerstheuniverse.wordpress.com/category/python-debugger/

4
LtGlahn

明らかにこれらの2つについて誰も言及したことはありません。

Pythonの前は、VBAを使用していました。定期的に更新されていない比較的古い言語ですが、VBAで気に入っていたのはデバッグ機能です。 VBAに最も近い、または私が出会った「ビジュアルデバッグ」とも呼ばれる2つのデバッグ機能は次のとおりです。

1-PyCharmデバッガー

これ 6分のビデオでPyCharmデバッガーのデモをご覧ください。

2-PixieDebugger-ずっと欲しかったJupyterノートブック用のビジュアルPythonデバッガー

多くのコーダーはJupyterNotebookを使用する傾向があるため、このデバッガーが役立ちます。 PixieDebuggerはPyCharmデバッガーとほぼ同じです。ここでは詳しく説明しません。

しかし、あなたはこれを参照することができます link

1
mcagriardic

IDEのフリーズを回避するために、Spyderでデバッグする方法を次に示します。デバッグモードでスクリプトを変更する場合、これを行います。

  1. 現在のIPython(デバッグ)コンソールを閉じます[x]
  2. 新しいメニューを開く[メニューバー->コンソール-> IPythonコンソールを開く]
  3. もう一度デバッグモードに入ります[青い再生一時停止ボタン]。

まだ少し迷惑ですが、変数リストをクリア(リセット)するという追加の利点があります。

1
oogieoogieful

ポイント3に関する1つの小さな追加事項:

また、デバッグコンソールは頻繁にフリーズ、印刷、評価などを行いましたが、停止(デバッグの終了)ボタンを押すと通常コールスタックの一番下に戻り、戻って(「u」)私がデバッグしていたフレームに。試してみる価値がある。これは、Spyderの新しいバージョン(2.3.5.2)の可能性があります

0
Paul

次のようなデバッグショートカットキーを使用できます。ステップオーバーF10 [ツール]> [設定]> [キーボードショートカット]

0
Mahyar