Visual Studio で Python コードをデバッグする

Visual Studio には、Python 用の包括的なデバッグ エクスペリエンスが用意されています。 この記事では、実行中のプロセスにデバッガーをアタッチし、[ウォッチ] ウィンドウと [イミディエイト] ウィンドウで式を評価する方法について説明します。 デバッガーでは、ローカル変数の検査、ブレークポイントの使用、ステートメントのステップインまたはステップアウトまたはステップオーバー、[次のステートメントの設定] などを行うことができます。

シナリオ固有のデバッグに関する情報については、次の記事を参照してください。

前提条件

プロジェクトの有無にかかわらずコードをデバッグする

Python 環境と引数を制御する場合は、まずコード用のプロジェクトを作成します。 "既存の Python コードから" プロジェクト テンプレートを使用してプロジェクトを作成できます。 詳細については、「既存の Python コード ファイルからプロジェクトを作成する」を参照してください。

ただし、Python コードをデバッグするために Visual Studio のプロジェクトまたはソリューション ファイルは必要ありません。 スタンドアロンの Python ファイルでコードをデバッグするには、Visual Studio でファイルを開き、[デバッグ]>[デバッグの開始] を選択します。 Visual Studio は、グローバルな既定の環境で、引数なしでスクリプトを起動します。 起動後、コードに対する完全なデバッグ サポートが提供されます。 詳細については、「Python 環境」をご覧ください。

基本的なデバッグを調べる

デバッグの基本的なワークフローには、ブレークポイントの設定、コードのステップ実行、値の検査、例外の処理が含まれます。 デバッグ セッションを開始する場合は、[デバッグ]>[デバッグの開始] を選択するか、F5 キーボード ショートカットを使用します。 プロジェクトの場合、これらのアクションによってスタートアップ ファイルが、プロジェクトのアクティブな環境で、[プロジェクトのプロパティ] で指定したコマンドライン引数または検索パスを使用して、起動されます。 プロパティを構成するには、「プロジェクトのデバッグ オプションを設定する」を参照してください。

プロジェクトのスタートアップ ファイルを設定する

プロジェクトのスタートアップ ファイルは、ソリューション エクスプローラーでは太字で表示されます。 スタートアップ ファイルとして使用するファイルを選択できます。

  • プロジェクト ファイルをスタートアップ ファイルとして指定するには、ファイルを右クリックし、[スタートアップ項目として設定] を選択します。

Visual Studio 2017 バージョン 15.6 以降では、指定したスタートアップ ファイル セットがない場合、アラートが表示されます。 それ以前のバージョンの Visual Studio では、Python インタープリターの実行中に [出力] ウィンドウが開いたり、[出力] ウィンドウが一時的に開いたり閉じたりする可能性があります。

アクティブな環境を指定する

プロジェクト ファイルを使用している場合、デバッガーはプロジェクトのアクティブな Python 環境で常に起動します。 現在のアクティブな環境を変更できます。 詳細については、「プロジェクトの Phthon 環境を選択する」を参照してください。

スタンドアロンの Python コード ファイルをデバッグしている場合、Visual Studio はグローバルな既定の環境で、引数なしでスクリプトを起動します。

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

ブレークポイントを設定すると、マークしたポイントでコードの実行が停止するので、プログラムの状態を確認することができます。

他のプログラミング言語を使用してきた開発者の場合、Python の一部のブレークポイントに驚く可能性があります。 Python では、ファイル全体が実行可能コードであるため、最上位のクラスまたは関数定義を処理するためにファイルが読み込まれたときに、そのファイルが実行されます。 ブレークポイントが設定されていると、クラス宣言の途中でデバッガーが中断する可能性もあります。 驚くかもしれませんが、これは正常な動作です。

  • ブレークポイントを設定するには、コード エディターの左余白を選択するか、コード行を右クリックして [ブレークポイント]>[ブレークポイントの挿入] を選択します。 ブレークポイントが設定されている行には赤い点が表示されます。

    Visual Studio のコード ファイルの左余白にブレークポイントがどのように表示されるかを示すスクリーンショット。

  • ブレークポイントを削除するには、赤い点をクリックするか、コード行を右クリックして [ブレークポイント]>[ブレークポイントの削除] を選択します。 また、赤い点を選択して、[ブレークポイント]>[ブレークポイントの無効化] を選択すると、ブレークポイントを無効にすることもできます。

    Visual Studio でコード ファイルの左余白にあるブレークポイントを無効にする方法を示すスクリーンショット。

条件とアクションを設定する

ブレークポイントをトリガーする条件は、カスタマイズすることができます。たとえば、変数が特定の値または値の範囲に設定されたときにのみ中断するなどです。

  • 条件を設定するには、ブレークポイントの赤い点を右クリックし、[条件] を選択します。 [ブレークポイントの設定] ダイアログが開きます。

    ダイアログでは、Python コードを使用して複数の条件を追加し、条件式を作成できます。 Visual Studio のこの機能の詳細については、「Breakpoint conditions」 (ブレークポイント条件) を参照してください。

    Visual Studio でブレークポイントの条件を設定するオプションを選択する方法を示すスクリーンショット。

  • ブレークポイントの [アクション] を設定するオプションもあります。 [出力] ウィンドウにログを記録するメッセージを作成し、必要に応じて自動的に実行を続行するように指定できます。

    Visual Studio でブレークポイントのトレースポイント アクションを作成する方法を示すスクリーンショット。

    メッセージをログに記録すると、ログ コードを直接アプリケーションに追加しないトレースポイントが作成されます。

ブレークポイントの条件とアクションをどのように構成するかによって、設定を示す左余白の赤いアイコンは変わります。 ドット形状、クロック タイマー、またはひし形が表示される可能性があります。

コードのステップ実行

Visual Studio がブレークポイントでコードの実行を停止した場合に、コードをステップ実行したり、コードのブロックを実行したりしてから、もう一度中断するために使用できるコマンドがいくつかあります。 これらのコマンドは、[デバッガー] ツール バー、[デバッグ] メニュー、コード エディターの右クリック コンテキスト メニュー、キーボード ショートカットなど、Visual Studio のいくつかの場所で使用できます。

次の表は、これらのコマンドの概要とキーボード ショートカットを示しています。

コマンド ショートカット 説明
Continue F5 次のブレークポイントに到達するまでコードを実行します。
ステップ イン F11 次のステートメントを実行して停止します。 次のステートメントが関数の呼び出しの場合、呼び出されている関数の最初の行でデバッガーは停止します。
ステップ オーバー F10 関数の呼び出し (そのすべてのコードの実行) や任意の戻り値の適用を含め、次のステートメントを実行します。 このコマンドを使用すると、デバッグする必要のない関数を簡単にスキップすることができます。
ステップ アウト Shift+F11 現在の関数の終わりまでコードを実行し、呼び出し元のステートメントに戻ります。 このコマンドは、現在の関数の残りの部分をデバッグする必要がない場合に便利です。
カーソル行の前まで実行 Ctrl+F10 エディターのキャレットの位置までコードを実行します。 このコマンドを使用すると、デバッグする必要がないコードのセグメントを簡単にスキップすることができます。
次のステートメントの設定 Ctrl+Shift+F10 コードの現在の実行ポイントを、キャレットの位置に変更します。 このコマンドを使用すると、エラーがある場合や望ましくない副作用があることがわかっている場合などに、コードのセグメントが実行されないようスキップすることができます。
[次のステートメントの表示] Alt+Num+\ コードで実行する次のステートメントに戻ります。 このコマンドは、デバッガーが停止しているコード内の場所を見つけるのに役立ちます。

値の検査および変更

デバッガーでコードの実行を停止すると、変数の値を検査して変更することができます。 ウォッチ ウィンドウを使用して、個々の変数やカスタム式を監視することもできます。 詳しくは、「変数を検査する」を参照してください。

  • デバッグ中にデータヒント機能を使用して値を表示するには、エディター内で変数の上にマウスを合わせます。 変数の値を選択して変更することができます。

    Visual Studio デバッガーの変数の DataTips 値を示すスクリーンショット。

  • [自動変数] ウィンドウを使用するには、[デバッグ]>[ウィンドウ]>[自動変数] を選択します。 このウィンドウには、現在のステートメントに近い変数と式が表示されます。 値を編集するには、値列をダブルクリックするか、値列を選択して F2 キーを入力します。

    Visual Studio デバッガーの Autos ウィンドウを示すスクリーンショット。

    [自動変数] ウィンドウの使用方法の詳細については、「自動変数ウィンドウとローカル ウィンドウで変数を検査する」を参照してください。

  • [ローカル] ウィンドウを使用するには、[デバッグ]>[ウィンドウ]>[ローカル] を選択します。 このウィンドウには、現在のスコープ内のすべての変数が表示されます。ここでも値は編集できます。

    Visual Studio デバッガーの [ローカル] ウィンドウを示すスクリーンショット。

    [ローカル] ウィンドウの使用方法の詳細については、「自動変数ウィンドウとローカル ウィンドウで変数を検査する」を参照してください。

  • [ウォッチ] ウィンドウを使用するには、[デバッグ]>[ウィンドウ]>[ウォッチ]>[ウォッチ1-4] を選択します。 このオプションを使用すると、任意の Python 式を入力して結果を表示できます。 式は、ステップごとに再評価されます。

    Visual Studio デバッガーの [ウォッチ] ウィンドウを示すスクリーンショット。

    [ウォッチ] ウィンドウの使用方法の詳細については、「ウォッチ ウィンドウとクイック ウォッチ ウィンドウを使用して変数のウォッチ ポイントを設定する」を参照してください。

  • 文字列値を調べるには、[値] エントリの右側にある [表示] (虫眼鏡) を選択します。 strunicodebytes、および bytearray の型はすべて検査に利用できます。

    [表示] ドロップダウン メニューには、4 つの視覚化オプション (テキスト、HTML、XML、JSON) が表示されます。

    Visual Studio デバッガーのビュー 虫眼鏡からビジュアライザーにアクセスする方法を示すスクリーンショット。

    視覚化を選択すると、選択した型に従って引用符で囲まれていない文字列値がポップアップ ダイアログに表示されます。 折り返しとスクロール、構文の強調表示、ツリー ビューを使用して、文字列を表示できます。 これらの視覚化は、長く複雑な文字列に関する問題をデバッグするのに役立ちます。

例外を表示する

プログラムのデバッグ中にエラーが発生し、そのエラーの例外ハンドラーがない場合、デバッガーは例外の発生ポイントで中断します。

Visual Studio デバッガーでハンドルされないエラーの例外ポップアップを示すスクリーンショット。

エラーが発生した場合は、現在のプログラムの状態を、呼び出し履歴を含めて調べることができます。 しかし、コードをステップ実行すると、デバッグ プロセスは、例外が処理されるか、プログラムが終了するまで、例外のスローを続行します。

  • 例外の展開ビューを表示するには、[デバッグ]>[ウィンドウ]>[例外設定] を選択します。

    Visual Studio デバッガーの [例外設定] ウィンドウを示すスクリーンショット。

    [例外設定] ウィンドウの例外の横にあるチェックボックスは、例外が発生したときにデバッガーを常に中断するかどうかを制御します。

  • 特定の例外に対する中断の頻繁を増やすには、[例外設定] ウィンドウの例外の横にあるチェックボックスを選択します。

  • 既定では、ほとんどの例外は、ソース コードに例外ハンドラーが見つからないときに中断します。 この動作を変更するには、例外を右クリックし、[ユーザー コードで処理されない場合は続行] オプションを変更します。 例外に対する中断の頻度を減らすには、このオプションを選択解除します。

  • [例外設定] ウィンドウに表示されない例外を構成するには、[追加] (プラス記号) を選択します。 監視する例外の名前を入力します。 この名前は、例外の完全名と一致している必要があります。

プロジェクトのデバッグ オプションを構成する

既定では、デバッガーは標準的な Python ランチャーを使用してプログラムを起動します。コマンドライン引数も、特別なパスや条件も使用しません。 デバッグ プロパティを設定すると、Python プロジェクトのスタートアップ オプションを構成できます。

  • プロジェクトのデバッグ プロパティにアクセスするには、ソリューション エクスプローラーで Pythonプロジェクトを右クリックし、[プロパティ] を選択してから [デバッグ] タブ を選択します。

    Visual Studio デバッガーでの Python プロジェクトのデバッグ プロパティを示すスクリーンショット。

以降のセクションでは、特定のプロパティについて説明します。

起動動作を定義する

次の表は、起動モード プロパティの入力可能値をまとめたものです。 デバッガーの起動動作を定義するには、このプロパティを使用します。

Value 説明
標準的な Python ランチャー CPython、IronPython、および Stackless Python などのバリエーションと互換性のあるポータブル Python で記述されたコードのデバッグに使用します。 このオプションは、純粋な Python コードをデバッグするのに最適です。 実行中の python.exe プロセスにアタッチすると、このプロパティで指定されたランチャーが使用されます。 このランチャーには CPython 用の混合モード デバッグも用意されているため、C/C++ コードと Python コードとの間でシームレスなステップ実行ができます。
Web ランチャー 起動時に既定のブラウザーを起動し、テンプレートのデバッグを有効にします。 詳細については、「Web テンプレートのデバッグ」を参照してください。
Django Web ランチャー Web ランチャー プロパティと同じ動作を、ただし Django 環境向けに実装します。 このオプションは、下位互換性の目的のみで使用します。
IronPython (.NET) ランチャー .NET デバッガーを使用します。IronPython でのみ機能しますが、C# や Visual Basic などの任意の .NET 言語プロジェクト間でステップ実行ができます。 このランチャーは、IronPython をホストする実行中の .NET プロセスにアタッチする場合に使用されます。

実行動作を定義する

次の表では、デバッガーの実行動作を構成するために設定できるプロパティについて説明します。

プロパティ 説明
検索パス Visual Studio がプロジェクトに使用するファイルとフォルダーの検索パスを指定します。 これらの値は、ソリューション エクスプローラーでプロジェクトの [検索パス] ノードに表示される項目と一致します。 このダイアログでは検索パスを指定できますが、フォルダーを参照したり、パスを相対フォームに自動的に変換したりできるソリューション エクスプローラーを使うほうが簡単です。
スクリプトの引数 Visual Studio がスクリプトの起動に使用するコマンドに追加し、スクリプトのファイル名の後に表示する引数を定義します。 値に記述されている最初の項目は sys.argv[1] として、2 番目の項目は sys.argv[2] として (その後も同様)、スクリプトで利用できます。
インタプリターの引数 ランチャーのコマンドラインのスクリプト名の前に追加する引数を記述します。 一般的な引数には、警告を制御する -W ...、プログラムを少し最適化する -O、バッファーなし IO を使用する -u などがあります。 IronPython のユーザーは、多くの場合、このフィールドを使用して -X オプションを渡します (-X:Frames-X:MTA など)。
インタープリターのパス 現在の環境に関連付けられているパスをオーバーライドするインタープリター パスを識別します。 この値は、非標準のインタープリターを使用してスクリプトを起動する場合に便利です。
環境変数 フォーム <NAME>=\<VALUE> のエントリを追加するには、このプロパティを使用します。 Visual Studio では、既存のグローバル環境変数に加えて、PYTHONPATH[検索パス] 設定に従って設定された後、最後にこのプロパティ値を適用します。 結果的に、この設定を使用して、これらの他の変数のいずれかを手動でオーバーライドできます。

対話型ウィンドウを使用する

デバッグ セッション中に使用できる対話型ウィンドウには、標準的な Visual Studio の [イミディエイト] ウィンドウと、[Python Debug Interactive] ウィンドウの 2 つがあります。

イミディエイト ウィンドウを開く

標準的な Visual Studio の [イミディエイト] ウィンドウを使用すると、Python 式をすばやく評価し、実行中のプログラムで変数を検査または割り当てることができます。 詳細については、「イミディエイト ウィンドウ」をご覧ください。

  • [イミディエイト] ウィンドウを開くには、[デバッグ]>[ウィンドウ]>[イミディエイト] を選択します。 キーボード ショートカット Ctrl+Alt+I を使用することもできます。

Debug Interactive ウィンドウを開く

[Python Debug Interactive] ウィンドウは、コードの記述や実行など、デバッグ中に利用できる完全な対話型 REPL エクスペリエンスを備えた充実した環境を提供します。 このウィンドウは、標準的な Python ランチャーを使用して、デバッガー内で開始されているプロセスに自動的に接続します ([デバッグ]>[プロセスにアタッチ] でアタッチされたプロセスも含みます)。 ただし、C/C++ の混合モード デバッグを使用している場合、このウィンドウは使用できません。

  • [Debug Interactive] ウィンドウを使用するには、[デバッグ]>[ウィンドウ]>[Python Debug Interactive] (Shift+Alt+I)] を選択します。

    Visual Studio で Python デバッグ 対話型ウィンドウを操作する方法を示すスクリーンショット。

[Debug Interactive] ウィンドウでは、次の表に示すように、標準 REPL コマンドに加えて、特別なメタコマンドがサポートされています。

コマンド 説明
$continue$cont$c 現在のステートメントからプログラムの実行を開始します。
$down$d スタック トレースで現在のフレームを 1 つ下のレベルに移動します。
$frame 現在のフレーム ID を表示します。
$frame 現在のフレームを指定のフレーム ID に切り替えます。
- <フレーム ID> 引数が必要です。
$load ファイルからコマンドを読み込み、完了するまで実行します。
$proc 現在のプロセス ID を表示します。
$proc 現在のプロセスを指定のプロセス ID に切り替えます。
- <プロセス ID> 引数が必要です。
$procs 現在デバッグ中のプロセスの一覧を表示します。
$stepin$step$s 次の関数呼び出しにステップ インします (可能な場合)。
$stepout$return$r 現在の関数からステップ アウトします。
$stepover$until$unt 次の関数呼び出しにステップオーバーします。
$thread 現在のスレッド ID を表示します。
$thread 現在のスレッドを指定のスレッド ID に切り替えます。
- <スレッド ID> 引数が必要です。
$threads 現在デバッグ中のスレッドの一覧を表示します。
$up$u スタック トレースで現在のフレームを 1 つ上のレベルに移動します。
$where$w$bt 現在のスレッドのフレームを一覧表示します。

標準のデバッガー ウィンドウのプロセススレッド呼び出し履歴などは、Debug Interactive ウィンドウとは同期されません。 Debug Interactive ウィンドウでアクティブなプロセス、スレッド、またはフレームを変更しても、他のデバッガー ウィンドウに影響はありません。 同様に、他のデバッガー ウィンドウでアクティブなプロセス、スレッド、またはフレームを変更しても、Debug Interactive ウィンドウに影響はありません。

レガシ デバッガーを使用します

環境の構成によっては、レガシ デバッガーの使用が必要になる場合があります。

  • Python 2.6、3.1 から 3.4、または IronPython を使用する Visual Studio 2017 バージョン 15.7 以前
  • Python 2.6、3.1 から 3.4、または IronPython を使用する Visual Studio 2019 バージョン 16.5 以降
  • ptvsd 3.x バージョンおよび初期 4.x バージョン

レガシ デバッガーは、Visual Studio 2017 バージョン 15.7 以前の既定値です。

  • レガシ デバッガーを使用するには、[ツール]>[オプション] を選択し、[Python]>[デバッグ] オプションを展開して、[レガシ デバッガーを使用] オプションを選択します。

前のバージョンの Visual Studio または Phthon をサポートする

Visual Studio 2017 バージョン 15.8 以降では、ptvsd バージョン 4.1 以降に基づくデバッガーが使用されます。 Visual Studio 2019 バージョン 16.5 以降では debugpy に基づくデバッガーが使用されます。 これらの 2 つのバージョンのデバッガーは、Python 2.7 以降または Python 3.5 以降と互換性があります。

Visual Studio のこれらのバージョンのいずれかを実行しているが、Python 2.6、3.1 から 3.4、または IronPython を使用している場合、Visual Studio には、"デバッガーではこの Python 環境はサポートされていません" というエラーが表示されます。

Visual Studio でこの環境エラーが報告された場合は、レガシ デバッガーを使用する必要があります。

前のバージョンの ptvsd をサポートする

現在の環境で前のバージョン (初期 4.0.x バージョン、またはリモート デバッグに必要な 3.x バージョンなど) の ptvsd を使用している場合、Visual Studio でエラーまたは警告が表示されることがあります。

環境で ptvsd 3.x を使用している場合、Visual Studio には、"デバッガー パッケージを読み込めませんでした" というエラーが表示されます。

デバッガー のエラー メッセージ

初期 4.x バージョンの ptvsd を使用している場合、"デバッガー パッケージが最新ではありません" という警告が表示されます。

デバッガーの警告メッセージ

Visual Studio でこうした環境エラーが報告された場合は、レガシ デバッガーを使用する必要があります。

重要

ptvsd の一部のバージョンについては警告を無視してかまわない場合もありますが、Visual Studio が正しく動作しない可能性はあります。

ptvsd のインストールを管理する

次の手順に沿って、ptvsd のインストールを管理します。

  1. [Python 環境] ウィンドウの [パッケージ] タブに移動します。

  2. 検索ボックスに「ptvsd」と入力して、インストールされている ptvsd のバージョンを確認します。

    [Python 環境] ウィンドウで ptvsd バージョンを確認する方法を示すスクリーンショット。

  3. バージョンが 4.1.1a9 より前のもの (Visual Studio にバンドルされていたバージョン) である場合は、パッケージの右側にある [X] を選択して古いバージョンをアンインストールします。 これで、Visual Studio ではバンドルされていたバージョンが使用されます (pip uninstall ptvsd コマンドを使用して PowerShell からアンインストールすることもできます)

  4. または、「デバッグ シナリオのトラブルシューティングを行う」セクションに記載されている手順に沿って、ptvsd パッケージを最新バージョンに更新できます。

デバッグ シナリオのトラブルシューティングを行う

以降のシナリオでは、デバッグ構成のその他のトラブルシューティング オプションについて説明します。

Visual Studio 2019 用 ptvsd をアップグレードする

Visual Studio 2019 バージョン 16.4 以前のデバッガーに問題がある場合は、次のようにまずはデバッガーのバージョンをアップグレードします。

  1. [Python 環境] ウィンドウの [パッケージ] タブに移動します。

  2. 検索ボックスに「ptvsd --upgrade」と入力して、[次のコマンドを実行する: pip install ptvsd --upgrade] を選択します (PowerShell から同じコマンドを使用することもできます)。

    [Python 環境] ウィンドウで ptvsd -upgrade コマンドを選択する方法を示すスクリーンショット。

    問題が解決しない場合は、PTVS GitHub リポジトリで問題を報告します。

    Note

    Visual Studio 2019 バージョン 16.5 以降では、debugpy は Visual Studio Python ワークロードの一部であり、Visual Studio と共に更新されます。

デバッガーのログ記録を有効にする

デバッガーの問題を調査する過程で、診断に役立つデバッガーのログを有効にしてログを収集するよう、Microsoft から求められる場合があります。

次の手順により、現在の Visual Studio セッションでのデバッグが有効になります。

  1. [ビュー]>[他のウィンドウ]>[コマンド ウィンドウ] を選択して、Visual Studio でコマンド ウィンドウを開きます。

  2. 次のコマンドを入力します。

    DebugAdapterHost.Logging /On /OutputWindow
    
  3. デバッグを開始し、問題を再現するために必要な手順を実行します。 この期間中、[デバッグ アダプターのホスト ログ] の下の [出力] ウィンドウにデバッグ ログが表示されます。 次に、そのウィンドウからログをコピーし、GitHub の問題やメールなどに貼り付けることができます。

    Visual Studio の [出力] ウィンドウのデバッガー ログ出力を示すスクリーンショット。

  4. Visual Studio が応答しなくなったり、または [出力] ウィンドウにアクセスできなくなったりした場合は、Visual Studio を再起動してコマンド ウィンドウを開き、次のコマンドを入力します。

    DebugAdapterHost.Logging /On
    
  5. デバッグを開始し、もう一度問題を再現します。 デバッガー ログは %temp%\DebugAdapterHostLog.txt にあります。