次の方法で共有


Visual Studio で Python プロジェクトのカスタム コマンドを定義する

Python プロジェクトを開発するときに、コマンド ウィンドウに切り替えて特定のスクリプトやモジュールを実行したり、pip コマンドを実行したり、コードで他のツールを使用したりできます。 ワークフローを改善するために、Visual Studio の Python プロジェクト メニューにカスタム コマンドを追加できます。 カスタム Python コマンドは、コンソール ウィンドウまたは Visual Studio 出力 ウィンドウで実行できます。 正規表現を使用して、コマンド出力からエラーと警告を解析する方法を Visual Studio に指示することもできます。

[前提条件]

Visual Studio for Mac はサポートされていません。 Windows、Mac、Linux 上の Visual Studio Code は、 使用可能な拡張機能を通じて Python と適切に連携します

カスタム コマンドを調べる

既定では、 Python プロジェクト メニューには、 PyLint の実行Mypy の実行という 2 つのコマンドが含まれています。

Visual Studio 2022 の Python プロジェクト メニューの既定のコマンドを示すスクリーンショット。

定義したカスタム Python コマンドは、この同じメニューに表示されます。 カスタム コマンドは、Python ファイル、Python モジュール、インライン Python コード、任意の実行可能ファイル、または pip コマンドを参照できます。 また、コマンドの実行方法と場所を指定することもできます。

カスタム コマンドは、いくつかの方法で追加できます。

  • Python プロジェクト ファイル (.pyproj) でカスタム コマンドを直接定義します。 これらのコマンドは、その特定のプロジェクトに適用されます。

  • ターゲット ファイル (.targets) でカスタム コマンドを定義します。 このファイル内のコマンドを簡単にインポートして、複数のプロジェクトで使用できます。

  • カスタム Python コマンドを定義する Python プロジェクトを Visual Studio のプロジェクト テンプレートから作成します。

    Visual Studio の特定の Python プロジェクト テンプレートでは、ターゲット ファイルを使用してカスタム コマンドを追加します。 Bottle Web Project テンプレートと Flask Web プロジェクト テンプレートには、 サーバーの開始デバッグ サーバーの開始という 2 つのコマンドが追加されます。 Django Web プロジェクト テンプレートでは、次のコマンドとさらにいくつかのコマンドが追加されます。

プロジェクトを再読み込みしてカスタム コマンドにアクセスする

Visual Studio でプロジェクトを開くときに、エディターで対応するプロジェクト ファイルに変更を加えた場合は、プロジェクトを再読み込みして変更を適用する必要があります。 同様に、Python プロジェクト ファイルでカスタム Python コマンドを定義した後、Python プロジェクト メニューにコマンドが表示されるように Python プロジェクトを再読み込みする必要があります。 ターゲット ファイルで定義されているカスタム コマンドを変更する場合は、そのターゲット ファイルをインポートするすべてのプロジェクトに対して、完全な Visual Studio ソリューションをリビルドする必要があります。

一般的な方法は、Visual Studio で Python プロジェクト ファイルを直接変更することです。

  1. Visual Studio で Python プロジェクトを開きます。 (Visual Studio でプロジェクトを開くと、プロジェクトは既定で 読み込まれます )。

  2. ソリューション エクスプローラーで、Python プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。

    Visual Studio によってプロジェクトがアンロードされ、対応する Python プロジェクト ファイル (.pyproj) がエディターで開かれます。

    プロジェクト ファイルが開かない場合は、Python プロジェクトをもう一度右クリックし、[ プロジェクト ファイルの編集] を選択します。

  3. Visual Studio エディターでプロジェクト ファイルを変更し、作業内容を保存します。

  4. ソリューション エクスプローラーで、アンロードされたプロジェクトを右クリックし、[プロジェクトの再読み込み] を選択します。 変更をプロジェクト ファイルに保存せずにプロジェクトを再読み込みしようとすると、Visual Studio によってアクションを完了するように求められます。

アンロード/編集/保存/再読み込みプロセスは、カスタム コマンドを開発するときに面倒になる可能性があります。 より効率的なワークフローでは、Visual Studio でプロジェクトを同時に読み込み、別のエディターで Python プロジェクト ファイルを開きます。 Visual Studio の別のインスタンス、Visual Studio Code、メモ帳など、任意のエディターを使用できます。 変更をエディターに保存して Visual Studio に戻ると、開いているプロジェクトのプロジェクト ファイルの変更が Visual Studio によって検出され、アクションを実行するように求められます。

開いているプロジェクトのプロジェクト ファイルへの変更を検出した後の Visual Studio プロンプトを示すスクリーンショット。

[ 再読み込み ] または [ すべて再読み込み] を選択すると、Visual Studio によってプロジェクト ファイルの変更が開いているプロジェクトに直ちに適用されます。

プロジェクト ファイルを使用してカスタム コマンドを追加する

次の手順では、Python プロジェクト ファイル (.pyproj) に定義を追加し、Visual Studio でプロジェクトを再読み込みして、カスタム コマンドを作成する方法を示します。 カスタム コマンドは、python.exe コマンドを使用してプロジェクトのスタートアップ ファイルを直接実行します。これは基本的に、Visual Studio のメイン ツール バーの [デバッグ>オプションを使用する場合と同じです。

  1. Visual Studio で、Python アプリケーション テンプレートを使用して 、Python-CustomCommands という名前の新しい Python プロジェクトを作成します。 手順については、「 クイック スタート: テンプレートから Python プロジェクトを作成する」を参照してください。

    Visual Studio によって Python プロジェクトが作成され、セッションに読み込まれます。 プロジェクト ファイル (.pyproj) を使用してプロジェクトを構成できます。 このファイルは、プロジェクトが開いている場合にのみ Visual Studio で表示されますが、 アンロードされます。 プロジェクトには、アプリケーション コード用の Python ファイル (.py) もあります。

  2. エディターで Python_CustomCommands.py アプリケーション ファイルを開き、次のコードを追加します。

    print("Hello custom commands")
    
  3. ソリューション エクスプローラーで Python プロジェクトを右クリックし、Python を選択し、コンテキスト メニューのコマンドに注目します。 現在、コンテキスト メニューのコマンドは PyLint の実行Mypy の実行のみです。 カスタム コマンドを定義すると、このメニューにも表示されます。

  4. Visual Studio セッションの外部で別のエディターを起動し、エディターで Python プロジェクト ファイル (Python-CustomCommands.pyproj) を開きます。 (Python アプリケーション ファイル (.py) ではなく、必ずプロジェクト ファイル (.pyproj) を開きます)。

  5. プロジェクト ファイルで、ファイルの末尾にある終了 </Project> 要素を見つけ、終了要素の直前に次の XML を追加します。

    <PropertyGroup>
      <PythonCommands>
        $(PythonCommands);
      </PythonCommands>
    </PropertyGroup>
    
  6. プロジェクト ファイルの変更を保存し、Visual Studio に切り替えます。 Visual Studio によってプロジェクト ファイルの変更が検出され、アクションの実行を求められます。 プロンプトで[ 再読み込み ]を選択し、開いているプロジェクトをプロジェクト ファイルの変更で更新します。

  7. ソリューション エクスプローラーで、Python プロジェクトを右クリックし、Python を選択して、コンテキスト メニューでコマンドを確認します。

    コンテキスト メニューには、[ PyLint の実行 ] コマンドと [Mypy の実行 ] コマンドのみが引き続き表示されます。 プロジェクト ファイルに追加したコードは、<PythonCommands> コマンドを含む既定の プロパティ グループをレプリケートするだけです。 次の手順では、カスタム コマンドのコードをさらに追加します。

  8. プロジェクト ファイルを更新するエディターに切り替えます。 <Target>要素内に次の<Project>要素定義を追加します。 <Target>定義は、前述の<PropertyGroup>定義の前または後に配置できます。

    この<Target>要素は、コンソール ウィンドウで コマンドを使用して、プロジェクトのスタートアップ ファイル (python.exe プロパティで識別) を実行するカスタム コマンドを定義します。 属性定義 ExecuteIn="consolepause" では、コンソール ウィンドウを閉じるキーの選択を待機するコンソールが使用されます。

    <Target Name="Example_RunStartupFile" Label="Run startup file" Returns="@(Commands)">
      <CreatePythonCommandItem
        TargetType="script"
        Target="$(StartupFile)"
        Arguments=""
        WorkingDirectory="$(MSBuildProjectDirectory)"
        ExecuteIn="consolepause">
        <Output TaskParameter="Command" ItemName="Commands" />
      </CreatePythonCommandItem>
    </Target>
    
  9. <PythonCommands> プロパティ グループ (手順 5 で追加) を次の XML に置き換えます。 この構文では、Nameにカスタム コマンドを追加する、<Target>要素の属性を定義します。 このコマンドには、[ スタートアップ ファイルの実行] というメニュー ラベルがあります。

      <PythonCommands>
        $(PythonCommands);
        Example_RunStartupFile
      </PythonCommands>
    

    ヒント

    $(PythonCommands) トークンで定義されている既定のコマンドの前にカスタム コマンドをコンテキスト メニューに表示する場合は、そのトークンの前にコマンドの<Target>構文を配置します。

  10. プロジェクト ファイルの変更を保存し、Visual Studio に切り替えます。 プロンプトで、プロジェクトを再読み込みします。

  11. ソリューション エクスプローラーで、Python プロジェクトを右クリックし、Python を選択し、コンテキスト メニューでコマンドを再確認します。

    これで、カスタムの [スタートアップ ファイルの実行 ] コマンドがメニューに表示されます。 カスタム コマンドが表示されない場合は、Name で説明したように、<Target>要素の<PythonCommands>属性値を 要素に追加したかどうかを確認します。 また、この記事の後半の 「トラブルシューティング 」セクションに記載されている考慮事項も確認してください。

  12. [ スタートアップ ファイルの実行 ] コマンドを選択します。 コンソール ウィンドウが開き、 Hello カスタム コマンド のテキストが表示され、続けて 任意のキーを押して続行します。 出力を確認し、コンソール ウィンドウを閉じます。

    カスタム コマンド スクリプトは、Python プロジェクトのアクティブ化された環境で実行されます。

  13. プロジェクト ファイルを使用してエディターに切り替えます。 <Target>要素定義 (手順 8 で追加) で、ExecuteIn属性の値をoutputに変更します。

      <CreatePythonCommandItem
        ...
        ExecuteIn="output">
        ...
      </CreatePythonCommandItem>
    
  14. 変更を保存し、Visual Studio に切り替えて、プロジェクトを再読み込みします。

  15. Python コンテキスト メニューから [スタートアップ ファイルの実行] カスタム コマンドをもう一度選択します。 これで、プログラムの出力がコンソール ウィンドウではなく Visual Studio の [出力] ウィンドウに表示されます。

  16. さらにカスタム コマンドを追加するには、次の同じプロセスに従います。

    1. プロジェクト ファイル内のカスタム コマンドに適した <Target> 要素を定義します。

    2. Name要素の<Target>属性値を<PythonCommands>プロパティ グループに追加します。

    3. 変更内容をプロジェクト ファイルに保存します。

    4. Visual Studio でプロジェクトを再読み込みします。

プロジェクトのプロパティを使用する

<Target>要素属性値のプロジェクト プロパティまたは環境変数を参照するには、$()$(StartupFile)などの$(MSBuildProjectDirectory) トークン内でプロパティ名を使用します。 詳細については、「 MSBuild プロパティ」を参照してください。

($StartupFile) プロパティなどのプロジェクト プロパティを使用する などのコマンドを呼び出し、トークンが未定義であるためにコマンドが失敗した場合、プロジェクトを再読み込みするまで、Visual Studio はコマンドを無効にします。 プロパティ定義を変更するプロジェクトに変更を加えた場合、関連するコマンドの状態は更新されません。 この場合も、プロジェクトを再読み込みする必要があります。

<Target> 要素の構造について

<Target>要素を使用して、カスタム コマンドの詳細を定義します。 <Target>要素の一般的な形式を次の擬似コードに示します。

<Target Name="Name1" Label="Display Name" Returns="@(Commands)">
    <CreatePythonCommandItem Target="filename, module name, or code"
        TargetType="executable/script/module/code/pip"
        Arguments="..."
        ExecuteIn="console/consolepause/output/repl[:Display name]/none"
        WorkingDirectory="..."
        ErrorRegex="..."
        WarningRegex="..."
        RequiredPackages="...;..."
        Environment="...">

      <!-- Output always appears in this form, with these exact attributes -->
      <Output TaskParameter="Command" ItemName="Commands" />
    </CreatePythonCommandItem>
  </Target>

ターゲット属性

次の表に、 <Target> 要素の属性を示します。

特性 必須 Description
Name イエス Visual Studio プロジェクト内のコマンドの識別子。 コマンドを <PythonCommands> コンテキスト メニューに表示するには、この名前を プロパティ グループに追加する必要があります。
Label イエス Python コンテキスト メニューに表示される UI 表示名。
Returns イエス 返される情報。ターゲットをコマンドとして識別する @(Commands) トークンが含まれている必要があります。

CreatePythonCommandItem 属性

<Target>要素には、カスタム コマンドの詳細な動作を定義する<CreatePythonCommandItem>要素と<Output>要素が含まれています。 次の表に、使用可能な <CreatePythonCommandItem> 要素の属性を示します。 すべての属性値は大文字と小文字を区別しません。

Attribute 必須 Description
TargetType イエス Target属性に含まれる内容と、Arguments属性と共に値を使用する方法を指定します。
- executable: Target 属性で指定された実行可能ファイルを実行し、コマンド ラインに直接入力したかのように、 Arguments 属性に値を追加します。 値には、引数のないプログラム名のみを含める必要があります。
- script: python.exe属性のファイル名と、Target属性の値を指定して、Arguments コマンドを実行します。
- module: python -m コマンドを実行し、 Target 属性のモジュール名の後に、 Arguments 属性の値を続けます。
- code: Target 属性に含まれるインライン コードを実行します。 Arguments属性値は無視します。
- pip: Target 属性のコマンドを使用して pip を実行し、その後に Arguments 属性の値を指定します。 ExecuteIn属性が output に設定されている場合、pip は要求が install コマンドを実行することを前提とし、パッケージ名として Target 属性を使用します。
Target イエス TargetType属性の値に応じて、使用するファイル名、モジュール名、コード、または pip コマンドを指定します。
Arguments オプション Target属性で使用する引数の文字列 (存在する場合) を提供します。
- TargetType属性値がscriptされると、Arguments コマンドではなく、python.exe値が Python プログラムに提供されます。
- TargetType 属性値が codeされると、 Arguments 値は無視されます。
ExecuteIn イエス コマンドを実行する環境を指定します。
- console: (既定値) コマンド ラインに直接入力されているかのように、Target値を使用してArguments属性を実行します。 Target属性の実行中は、コマンド ウィンドウが表示され、自動的に閉じます。
- consolepause: consoleと同じ動作ですが、ウィンドウを閉じる前にキーを押すのを待ちます。
- output: Target 属性を実行し、Visual Studio の出力 ウィンドウに結果を表示します。 TargetType属性がpipされている場合、Visual Studio はパッケージ名として Target 属性を使用し、Arguments属性値を追加します。
- repl: Target属性を実行します。 オプションの表示名は、ウィンドウのタイトルに使用されます。
- none: consoleと同じ動作。
WorkingDirectory オプション コマンドを実行するフォルダーを識別します。
ErrorRegex
WarningRegEx
オプション ExecuteIn属性が output に設定されている場合にのみ使用されます。 どちらの属性値も、コマンド出力を解析し、[エラー 一覧 ] ウィンドウにエラーと警告を表示するために Visual Studio で使用される正規表現を指定します。 これらの属性が指定されていない場合、コマンドは [エラー一覧 ] ウィンドウには影響しません。 Visual Studio で想定される内容の詳細については、「 名前付きキャプチャ グループ」を参照してください。
RequiredPackages オプション requirements.txtファイル ( pip.readthedocs.io ) と同じ形式を使用して、コマンドのパッケージ要件の一覧を提供します。 たとえば、[ PyLint の実行 ] コマンドでは、 pylint>=1.0.0形式を指定します。 コマンドを実行する前に、一覧のすべてのパッケージがインストールされていることを Visual Studio で確認します。 Visual Studio では、pip を使用して不足しているパッケージをインストールします。
Environment オプション コマンドを実行する前に定義する環境変数の文字列を識別します。 各変数は、セミコロンで区切られた複数の変数を持つフォーム \<NAME>=\<VALUE> を使用します。 複数の値を持つ変数は、 'NAME=VALUE1;VALUE2'のように、単一引用符または二重引用符で囲む必要があります。

正規表現の名前付きキャプチャ グループ

Visual Studio は、カスタム コマンド出力からエラーと警告を解析する際に、ErrorRegex および WarningRegex 属性値の中にある正規表現が、次の名前付きグループを使用することを想定しています。

  • (?<message>...): エラーのテキスト。
  • (?<code>...): エラー コード値。
  • (?<filename>...): エラーが報告されるファイルの名前。
  • (?<line>...): エラーが報告されるファイル内の場所の行番号。
  • (?<column>...): エラーが報告されるファイル内の場所の列番号。

たとえば、PyLint は次の形式の警告を生成します。

************* Module hello
C:  1, 0: Missing module docstring (missing-docstring)

Visual Studio でこれらの警告から適切な情報を抽出し、[エラー一覧] ウィンドウに表示できるようにするには、[WarningRegex] コマンドの属性値を次に示します。

^(?<filename>.+?)\((?<line>\d+),(?<column>\d+)\): warning (?<msg_id>.+?): (?<message>.+?)$]]

msg_idで説明されているように、WarningRegex属性値におけるcodeの構文は実際にcodeである必要があります。

ターゲット ファイルを使用してカスタム コマンドをインポートする

Python プロジェクト ファイルでカスタム コマンドを定義する場合、コマンドはその特定のプロジェクトでのみ使用できます。 カスタム コマンドを作成して複数のプロジェクトで使用する場合は、ターゲット ファイル (<PythonCommands>) 内のすべての<Target>要素で プロパティ グループを定義し、そのファイルを Python プロジェクトにインポートできます。

  • ターゲット ファイルでは、Python プロジェクト ファイル (.pyproj) の説明に従って、同じ形式と構文を使用してカスタム コマンドを定義します。 構成する一般的な要素には、 <PythonCommands><Target><CreatePythonCommandItem>、および <Output>が含まれます。

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
       <PropertyGroup>
         <PythonCommands>
           $(PythonCommands);
           <!-- Additional command names -->
         </PythonCommands>
       </PropertyGroup>
    
       <Target Name="..." Label="..." Returns="@(Commands)">
         <!-- CreatePythonCommandItem and Output elements... -->
       </Target>
    
       <!-- Any number of additional Target elements-->
    </Project>
    
  • ターゲット ファイルをプロジェクトにインポートするには、プロジェクト ファイル内の <Import Project="(path)"> 要素内の任意の場所に<Project>要素を追加します。

    たとえば、Python プロジェクト内のターゲット フォルダーに CustomCommands.targets という名前のプロジェクト ファイルがある場合は、次のコードをプロジェクト ファイルに追加します。

    <Import Project="targets/CustomCommands.targets"/>
    
  • プロジェクト ファイルがターゲット ファイルをインポートし、Visual Studio でプロジェクトを開いている間にターゲット ファイルを変更する場合は、プロジェクトだけでなく、プロジェクトを含む Visual Studio ソリューションリビルドする必要があります。

コマンド例

次のセクションでは、Python プロジェクトのカスタム コマンドを定義するために使用できるコード例を示します。

PyLint (モジュール ターゲット) を実行する

Microsoft.PythonTools.targets ファイルに次のコードが表示されます。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);PythonRunPyLintCommand</PythonCommands>
  <PyLintWarningRegex>
    <![CDATA[^(?<filename>.+?)\((?<line>\d+),(?<column>\d+)\): warning (?<msg_id>.+?): (?<message>.+?)$]]>
  </PyLintWarningRegex>
</PropertyGroup>

<Target Name="PythonRunPyLintCommand"
        Label="resource:Microsoft.PythonTools.Common;Microsoft.PythonTools.Common.Strings;RunPyLintLabel"
        Returns="@(Commands)">
  <CreatePythonCommandItem Target="pylint.lint"
                           TargetType="module"
                           Arguments="&quot;--msg-template={abspath}({line},{column}): warning {msg_id}: {msg} [{C}:{symbol}]&quot; -r n @(Compile, ' ')"
                           WorkingDirectory="$(MSBuildProjectDirectory)"
                           ExecuteIn="output"
                           RequiredPackages="pylint&gt;=1.0.0"
                           WarningRegex="$(PyLintWarningRegex)">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

特定のパッケージを使用して pip インストールを実行する (pip ターゲット)

次のコマンドは、Visual Studio pip install my-packageウィンドウで コマンドを実行します。 パッケージを開発し、そのインストールをテストするときに、次のようなコマンドを使用できます。 <Target>要素には、install コマンドではなくパッケージ名が含まれています。これは、ExecuteIn="output"属性定義を使用する場合に想定されます。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);InstallMyPackage</PythonCommands>
</PropertyGroup>

<Target Name="InstallMyPackage" Label="pip install my-package" Returns="@(Commands)">
  <CreatePythonCommandItem Target="my-package" TargetType="pip" Arguments=""
    WorkingDirectory="$(MSBuildProjectDirectory)" ExecuteIn="output">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

古い pip パッケージを表示する (pip ターゲット)

次のコマンドは、 list 関数で pip を実行して、古い pip パッケージを識別します。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);ShowOutdatedPackages</PythonCommands>
</PropertyGroup>

<Target Name="ShowOutdatedPackages" Label="Show outdated pip packages" Returns="@(Commands)">
  <CreatePythonCommandItem Target="list" TargetType="pip" Arguments="-o --format columns"
    WorkingDirectory="$(MSBuildProjectDirectory)" ExecuteIn="consolepause">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

コンソールの一時停止を使用して実行可能ファイルを実行する

次のコマンドは、 where 関数を実行して、プロジェクト フォルダーから始まる Python ファイルの場所を表示します。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);ShowAllPythonFilesInProject</PythonCommands>
</PropertyGroup>

<Target Name="ShowAllPythonFilesInProject" Label="Show Python files in project" Returns="@(Commands)">
  <CreatePythonCommandItem Target="where" TargetType="executable" Arguments="/r . *.py"
    WorkingDirectory="$(MSBuildProjectDirectory)" ExecuteIn="output">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

サーバーの実行とデバッグ サーバー コマンドの実行

Web プロジェクトの スタート サーバー コマンドと Start デバッグ サーバー コマンドがどのように定義されているかを調べるには、GitHub の Microsoft.PythonTools.Web.targets リポジトリを調べます。

開発用パッケージをインストールする

次のコードでは、pip を実行してパッケージをインストールします。

<PropertyGroup>
  <PythonCommands>PipInstallDevCommand;$(PythonCommands);</PythonCommands>
</PropertyGroup>

<Target Name="PipInstallDevCommand" Label="Install package for development" Returns="@(Commands)">
    <CreatePythonCommandItem Target="pip" TargetType="module" Arguments="install --editable $(ProjectDir)"
        WorkingDirectory="$(WorkingDirectory)" ExecuteIn="Repl:Install package for development">
      <Output TaskParameter="Command" ItemName="Commands" />
    </CreatePythonCommandItem>
  </Target>

fxthomas/Example.pyproj.xml (GitHub) から、アクセス許可と共に使用されます。

Windows インストーラーを生成する

次のスクリプトでは、Windows インストーラーが生成されます。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);BdistWinInstCommand;</PythonCommands>
</PropertyGroup>

<Target Name="BdistWinInstCommand" Label="Generate Windows Installer" Returns="@(Commands)">
    <CreatePythonCommandItem Target="$(ProjectDir)setup.py" TargetType="script"
        Arguments="bdist_wininst --user-access-control=force --title &quot;$(InstallerTitle)&quot; --dist-dir=&quot;$(DistributionOutputDir)&quot;"
        WorkingDirectory="$(WorkingDirectory)" RequiredPackages="setuptools"
        ExecuteIn="Repl:Generate Windows Installer">
      <Output TaskParameter="Command" ItemName="Commands" />
    </CreatePythonCommandItem>
  </Target>

fxthomas/Example.pyproj.xml (GitHub) から、アクセス許可と共に使用されます。

Python ホイール パッケージを生成する

次のスクリプトでは、 Python ホイール パッケージが生成されます。

<PropertyGroup>
  <PythonCommands>$(PythonCommands);BdistWheelCommand;</PythonCommands>
</PropertyGroup>

<Target Name="BdistWheelCommand" Label="Generate Wheel Package" Returns="@(Commands)">

  <CreatePythonCommandItem Target="$(ProjectDir)setup.py" TargetType="script"
      Arguments="bdist_wheel --dist-dir=&quot;$(DistributionOutputDir)&quot;"
      WorkingDirectory="$(WorkingDirectory)" RequiredPackages="wheel;setuptools"
      ExecuteIn="Repl:Generate Wheel Package">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

fxthomas/Example.pyproj.xml (GitHub) から、アクセス許可と共に使用されます。

カスタム コマンドのトラブルシューティング

カスタム コマンドの操作に関連して考えられる問題については、次のセクションを参照してください。

プロジェクト ファイルが読み込まれていない

このエラー メッセージは、プロジェクト ファイルに構文エラーがあることを示します。 このメッセージには、行番号と文字位置を含む特定のエラーが含まれています。

コマンドの実行後にコンソール ウィンドウが閉じる

コマンドの実行直後にコンソール ウィンドウが閉じる場合は、ExecuteIn="consolepause"の代わりにExecuteIn="console"属性定義を使用します。

メニューにコマンドがありません

Python コンテキスト メニューにカスタム コマンドが表示されない場合は、次の項目を確認します。

  • コマンドが <PythonCommands> プロパティ グループに含まれていることを確認します。
  • コマンド リストで定義されているコマンド名が、 <Target> 要素で指定された名前と一致することを確認します。

次に例を示します。 次の XML スニペットでは、Example プロパティ グループの<PythonCommands>名が、ExampleCommand要素定義の<Target>名と一致しません。 Visual Studio で Example という名前のコマンドが見つからないため、コマンドは表示されません。 コマンド リストで ExampleCommand を使用するか、ターゲットの名前を Exampleのみに変更します。

  <PropertyGroup>
    <PythonCommands>$(PythonCommands);Example</PythonCommands>
  </PropertyGroup>
  <Target Name="ExampleCommand" Label="Example Command" Returns="@(Commands)">
    <!-- ... -->
  </Target>

コマンドの実行中にエラーが発生し、コマンド ターゲットを取得できませんでした

このエラー メッセージは、 <Target> 要素または <CreatePythonCommandItem> 要素の内容が正しくないことを示します。

このエラーの考えられる理由を次に示します。

  • 必須の <Target> 要素属性が空です。
  • 必要な TargetType 属性が空であるか、認識されない値が含まれています。
  • 必要な ExecuteIn 属性が空であるか、認識されない値が含まれています。
  • ErrorRegex属性またはWarningRegex属性は、ExecuteIn="output"属性定義を設定せずに指定します。
  • 認識できない属性が要素に存在します。 たとえば、属性参照のスペルがArgumnetsではなく、Argumentsと間違える場合があります。

未定義のプロパティを参照する場合は、属性値を空にすることができます。 トークン $(StartupFile) を使用しても、プロジェクトでスタートアップ ファイルが定義されていない場合、トークンは空の文字列に解決されます。 このような場合は、既定値を定義できます。 たとえば、Bottle、Flask、Django プロジェクト テンプレートで定義されている [ サーバーの実行 ] コマンドと [ デバッグ サーバーの実行 ] コマンドでは、既定で manage.py ファイルが使用されます (サーバースタートアップ ファイルがプロジェクトのプロパティで指定されていない場合)。

Visual Studio が応答を停止し、クラッシュする

カスタム コマンドの実行時に Visual Studio が応答を停止し、クラッシュした場合は、 ExecuteIn="output" 属性定義を使用してコンソール コマンドを実行しようとしている可能性があります。 このような場合、Visual Studio は出力を解析しようとしたときにクラッシュする可能性があります。 この状態を回避するには、代わりに ExecuteIn="console" 属性定義を使用します。 詳細については、 問題 3681 を参照してください。

コマンドが操作可能なプログラムまたはバッチ ファイルとして認識されない

TargetType="executable"属性定義を設定する場合、Target属性の値は、pythonのみなど、引数のないプログラム名python.exeする必要があります。 この場合は、引数を Arguments 属性に移動します。