1. ホーム
  2. python

[解決済み] IPythonによるステップバイステップのデバッギング

2022-04-23 07:19:46

質問

私が読んだところでは、Pythonでコードをデバッグする方法は2つあります。

  • のような伝統的なデバッガを使用します。 pdb または ipdb . これは、次のようなコマンドをサポートしています。 c に対して continue , n について step-over , s について step-into など)、しかし、オブジェクトの検査に非常に便利なIPythonシェルに直接アクセスすることはできません。

  • 使用方法 IPython によって 埋め込み IPythonのシェルをコードに組み込むことができます。次のようなことができます。 from IPython import embed を使用し、その後に embed() をコードに組み込んでください。あなたのプログラム/スクリプトが embed() という文があると、IPythonのシェルに落とされます。これにより、IPythonの良いところをすべて使って、オブジェクトの完全な検査とPythonコードのテストができるようになります。しかし embed() はできません。 ステップバイステップ キーボードのショートカットを使って、もうコードを書くことはできません。

両者の良いところを組み合わせる方法はないのでしょうか?すなわち

  1. できること ステップ・バイ・ステップ 便利な pdb/ipdb キーボードショートカットを使って、あなたのコードを処理します。
  2. そのようなステップ(例えば、与えられたステートメント上)において、本格的な IPython シェル .

IPythonデバッギング のように MATLABです。

このタイプの "enhanced debugging" の例は、MATLAB で見ることができ、ユーザーは次のようになります。 常に はMATLABエンジン/シェルへのフルアクセスを持っていますが、その際も <強い ステップ・バイ・ステップ 条件付きブレークポイントを設定することもできます。他のユーザーと議論したところ、これはMATLABからIPythonに移行する際に、人々が最も恋しいと思うデバッグ機能です。

Emacsや他のエディタでのIPythonのデバッグ。

あまり具体的な質問にはしたくないのですが、私はほとんどEmacsで仕事をしているので、この機能をEmacsに取り入れる方法はないでしょうか? 理想的なのは Emacs(またはエディタ)は、プログラマがコード上の任意の場所にブレークポイントを設定し、インタプリタまたはデバッガと通信して、任意の場所で停止させ、その場所で完全なIPythonインタプリタを表示させることができるようにします。

どのように解決するのですか?

IPythonの %pdb マジック . 呼び出すだけ %pdb をIPythonで実行し、エラーが発生すると、自動的に ipdb . すぐにステップを踏んでいない間、あなたは ipdb を経てからです。

このため、個々の関数のデバッグが容易になります。 %load を作成し、関数を実行します。を使って強制的にエラーにすることができます。 assert を適切な位置に配置する。

%pdb はラインマジックです。呼び方は %pdb on , %pdb 1 , %pdb off または %pdb 0 . 引数なしで呼び出された場合は、トグルとして動作します。