Python プロジェクトの開発時には、コマンド ウィンドウに切り替えて特定のスクリプトやモジュールを実行したり、pip コマンドを実行したり、コードで他のツールを使用したりすることがあります。 ワークフローを改善したい場合は、Visual Studio の [Python] プロジェクト メニューにカスタム コマンドを追加できます。 カスタム Python コマンドは、コンソール ウィンドウまたは Visual Studio の出力ウィンドウで実行できます。 また、正規表現を使って、コマンド出力からエラーと警告を解析する方法を Visual Studio に指示することもできます。
前提条件
- Python ワークロードをサポートする Visual Studio が Windows にインストールされていること。 詳細については、「Visual Studio での Python サポートのインストール」をご覧ください。
Visual Studio for Mac はサポートされていません。 詳細については、「Visual Studio for Mac の現状」を参照してください。Windows、Mac、および Linux での Visual Studio Code は、利用可能な拡張機能を使用して Python コードを問題なく操作できます。
カスタム コマンドについて
デフォルトの場合、[Python] プロジェクト メニューには、[PyLint の実行] と [Mypy の実行] という 2 つのコマンドが表示されます。
定義したすべてのカスタム Python コマンドも、このメニューに表示されます。 カスタム コマンドからは、Python ファイル、Python モジュール、インライン Python コード、任意の実行可能ファイル、pip コマンドを参照できます。 また、コマンドを実行する方法と場所も指定できます。
カスタム コマンドの追加には、次の方法を選択できます。
Python プロジェクト ファイル (.pyproj) 内にカスタム コマンドを直接定義します。 これらのコマンドは、その特定のプロジェクトに適用されます。
ターゲット ファイル (.targets) 内でカスタム コマンドを定義します。 このファイル内のコマンドは。簡単にインポートして、複数のプロジェクトで使用できます。
カスタム Python コマンドを定義する Visual Studio のプロジェクト テンプレートから Python プロジェクトを作成します。
Visual Studio の特定の Python プロジェクト テンプレートでは、ターゲット ファイルを使用してカスタム コマンドを追加します。 Bottle Web プロジェクトと Flask Web プロジェクトのテンプレートでは、[サーバーの起動] と [デバッグ サーバーの開始] という 2 つのコマンドが追加されます。 Django Web プロジェクト テンプレートでは、次のコマンドなど、複数のコマンドが追加されます。
プロジェクトを再読み込みして、カスタム コマンドにアクセスする
Visual Studio でプロジェクトを開き、対応するプロジェクト ファイルをエディターで変更する場合は、プロジェクトを再読み込みして、変更を適用する必要があります。 同様に、Python プロジェクト ファイルでカスタム Python コマンドを定義後、[Python] プロジェクト メニューにそれらのコマンドを表示するには、Python プロジェクトを再読み込みする必要があります。 ターゲット ファイルで定義したカスタム コマンドを変更するには、そのターゲット ファイルをインポートするプロジェクトの Visual Studio ソリューションを全体的にリビルドする必要があります。
この場合は、通常、Python プロジェクト ファイルを Visual Studio で直接変更します。手順は以下のとおりです。
Visual Studio で Python プロジェクトを開きます。 (Visual Studio でプロジェクトを開くと、デフォルトでそのプロジェクトが読み込まれます。)
ソリューション エクスプローラーで、Python プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。
プロジェクトがアンロードされ、対応する Python プロジェクト ファイル (.pyproj) がエディターで開きます。
プロジェクト ファイルが開かない場合は、Python プロジェクトをもう一度右クリックし、[プロジェクト ファイルの編集] を選択します。
Visual Studio エディターでプロジェクト ファイルを変更して、作業内容を保存します。
ソリューション エクスプローラーで、アンロードしたプロジェクトを右クリックし、[プロジェクトの再読み込み] を選択します。 変更をプロジェクト ファイルに保存せずにプロジェクトを再読み込みしようとすると、そのアクションを完了するように求められます。
カスタム コマンドを開発していると、アンロード、編集、保存、再読み込みというプロセスが面倒に感じられることもあります。 ワークフローを効率化するには、Visual Studio にプロジェクトを読み込み、同時に、別のエディターで Python プロジェクト ファイルを開くと良いでしょう。 別の Visual Studio インスタンス、Visual Studio Code、メモ帳など、任意のエディターを使用できます。 エディターで変更を保存し、Visual Studio に戻ると、開いているプロジェクトのプロジェクト ファイルの変更が検出され、次のように、アクションの実行を求めるメッセージが表示されます。
[再読み込み] または [すべて再読み込み] を選択すると、プロジェクト ファイルの変更が、開いているプロジェクトにすぐに適用されます。
プロジェクト ファイルを使用して、カスタム コマンドを追加する
次の手順では、Visual Studio で、Python プロジェクト ファイル (.pyproj) に定義を追加してプロジェクトを再読み込みすることでカスタム コマンドを作成します。 このカスタム コマンドでは、python.exe
コマンドを使用して、プロジェクトのスタートアップ ファイルを直接実行します。これは、基本的に、Visual Studio のメイン ツール バーの [デバッグ]>[デバッグなしで開始] オプションを使用するのと同じ操作です。
Visual Studio で、Python アプリケーション テンプレートを使用して、Python-CustomCommands という名前の新しい Python プロジェクトを作成します。 手順については、「クイックスタート: テンプレートから、Python プロジェクトを作成する」を参照してください。
Python プロジェクトが作成され、セッションに読み込まれます。 プロジェクトを設定するには、プロジェクト ファイル (.pyproj) を使用します。 このファイルは、プロジェクトを開いているときのみ表示できますが、実際には読み込まれません。 プロジェクト内には、アプリケーション コードを記述する Python ファイル (.py) もあります。
Python_CustomCommands.py アプリケーション ファイルをエディターで開き、次のコードを追加します。
print("Hello custom commands")
ソリューション エクスプローラーで、Python プロジェクトを右クリックして、[Python] を選択し、コンテキスト メニューのコマンドを確認します。 この時点でコンテキスト メニューに表示されているコマンドは、[PyLint の実行] と [Mypy の実行] のみです。 カスタム コマンドを定義すると、それもこのメニューに表示されます。
Visual Studio のセッション外で別のエディターを起動し、Python プロジェクト ファイル (Python-CustomCommands.pyproj) をそのエディターで開きます。 (Python アプリケーション ファイル (.py) ではなく、プロジェクト ファイル (.pyproj) を開いてください。)
プロジェクト ファイルで、ファイルの末尾にある
</Project>
終了要素を確認して、その要素の直前に次の XML を追加します。<PropertyGroup> <PythonCommands> $(PythonCommands); </PythonCommands> </PropertyGroup>
プロジェクト ファイルの変更を保存して、Visual Studio に切り替えます。 プロジェクト ファイルの変更が検出され、アクションの実行を求められます。 プロンプトで [再読み込み] を選択し、開いているプロジェクトを、変更したプロジェクト ファイルで更新します。
ソリューション エクスプローラーで、Python プロジェクトを右クリックして、[Python] を選択し、コンテキスト メニューのコマンドを確認します。
コンテキスト メニューには、この時点でも [PyLint の実行] と [Mypy の実行] コマンドのみ表示されています。 プロジェクト ファイルに追加したコードでは、PyLint コマンドが含まれるデフォルト
<PythonCommands>
プロパティ グループのレプリケーションしか行いません。 次の手順では、カスタム コマンドのコードをさらに追加します。プロジェクト ファイルを更新するエディターに切り替えます。 次の
<Target>
要素定義を<Project>
要素内に追加します。<Target>
定義は、前述の<PropertyGroup>
定義の前または後に配置できます。この
<Target>
要素によって、コンソール ウィンドウでpython.exe
コマンドを使用して、プロジェクトのスタートアップ ファイル (StartupFile プロパティで指定する) を実行するカスタム コマンドを定義します。 属性定義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>
手順 5 で追加した
<PythonCommands>
プロパティ グループを次の XML に置き換えます。 この構文では、Name
要素の<Target>
属性を定義します。この要素によって、カスタム コマンドが [Python] コンテキスト メニューに追加されます。 このコマンドには、[Run startup file] (スタートアップ ファイルの実行) というメニュー ラベルが付いています。<PythonCommands> $(PythonCommands); Example_RunStartupFile </PythonCommands>
ヒント
コンテキスト メニューのカスタム コマンドを、
$(PythonCommands)
トークンで定義したデフォルト コマンドの上に表示するには、カスタム コマンドの<Target>
構文をそのトークンの前に配置します。プロジェクト ファイルの変更を保存して、Visual Studio に切り替えます。 プロンプトが表示されるので、プロジェクトを再読み込みします。
ソリューション エクスプローラーで、Python プロジェクトを右クリックして、[Python] を選択し、コンテキスト メニューのコマンドを再確認します。
これで、カスタムの [スタートアップ ファイルの実行] コマンドがメニューに追加されました。 カスタム コマンドが表示されない場合は、
Name
要素の<Target>
属性値を 手順 9 の説明どおりに<PythonCommands>
要素に追加したことを確認します。 また、この記事で後述している「トラブルシューティング」セクションの考慮事項も参照してください。[スタートアップ ファイルの実行] コマンドを選択します。 コンソール ウィンドウが開き、Hello custom commands に続いて Press any key to continue というテキストが表示されます。 出力内容を確認して、コンソール ウィンドウを閉じます。
Note
カスタム コマンド スクリプトは、アクティブ化した Python プロジェクト環境で実行されます。
プロジェクト ファイルを編集しているエディターに切り替えます。 手順 8 で追加した
<Target>
要素定義にあるExecuteIn
属性の値をoutput
に変更します。<CreatePythonCommandItem ... ExecuteIn="output"> ... </CreatePythonCommandItem>
変更を保存して、Visual Studio に切り替え、プロジェクトを再読み込みします。
Python コンテキスト メニューから [スタートアップ ファイルの実行] カスタム コマンドを再度選択します。 これで、プログラムの出力がコンソール ウィンドウではなく Visual Studio の出力ウィンドウに表示されます。
カスタム コマンドをさらに追加するには、次のプロセスに従います。
プロジェクト ファイルで、カスタム コマンドに適した
<Target>
要素を定義します。<Target>
要素のName
属性値を<PythonCommands>
プロパティ グループに追加します。プロジェクト ファイルへの変更を保存します。
Visual Studio でプロジェクトを再読み込みします。
プロジェクト プロパティを使用する
<Target>
要素の属性値でプロジェクト プロパティまたは環境変数を参照するには、$(StartupFile)
や $(MSBuildProjectDirectory)
といった、$()
トークン内のプロパティ名を使用します。 詳細については、「MSBuild プロパティ」を参照してください。
StartupFile プロパティなどのプロジェクト プロパティを使用する ($StartupFile)
などのコマンドを呼び出した際に実行に失敗し、原因がトークンの未定義であった場合、そのコマンドは、プロジェクトを再読み込みするまで無効になります。 プロパティ定義を修正してプロジェクトを変更しても、それだけでは関連コマンドの状態は更新されません。 この場合もプロジェクトを再読み込みする必要があります。
<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 の属性
次の表に、<Target>
要素の属性を示します。
Attribute | 必須 | Description |
---|---|---|
Name |
はい | Visual Studio プロジェクト内でのコマンドの識別子です。 [Python] のコンテキスト メニューにコマンドを表示するには、この名前を <PythonCommands> プロパティ グループに追加する必要があります。 |
Label |
はい | [Python] のコンテキスト メニューに表示される UI の表示名です。 |
Returns |
はい | 返る情報。ターゲットがコマンドとして識別されるように @(Commands) トークンを指定する必要があります。 |
CreatePythonCommandItem の属性
<Target>
要素内には、<CreatePythonCommandItem>
要素と <Output>
要素があり、これによってカスタム コマンドの詳細な動作を定義します。 次の表に、使用可能な <CreatePythonCommandItem>
要素の属性を示します。 すべての属性値は、大文字と小文字を区別されません。
Attribute |
必須 | Description |
---|---|---|
TargetType |
はい | Target 属性で指定する内容と、その値を Arguments 属性とともにどのように使用するかを記述します。- executable : Arguments 属性で指定した実行可能ファイルを Target 属性の値を追加して実行します。コマンド ラインへの直接入力と同様に実行されます。 値には、引数なしのプログラム名のみが含まれる必要があります。 - script : Target 属性のファイル名の後に Arguments 属性の値を指定して python.exe コマンドを実行します。 - module : python -m 属性のモジュール名の後に Target 属性の値を指定して Arguments コマンドを実行します。 - code : Target 属性で指定したインライン コードを実行します。 Arguments 属性値は無視されます。 - pip : Target 属性のコマンドを使用して pip を実行します。実行時には Arguments 属性の値が指定されます。 ExecuteIn 属性を output に設定している場合、install コマンドを実行するリクエストと解釈され、Target 属性がパッケージ名として使用されます。 |
Target |
はい | TargetType 属性の値に応じて、使用するファイル名、モジュール名、コード、または pip コマンドを指定します。 |
Arguments |
省略可能 | Target 属性で使用する引数の文字列を必要に応じて指定します。 - TargetType 属性値が script の場合、Arguments 値には python.exe コマンドではなく Python プログラムを指定します。 - TargetType 属性値が code の場合、Arguments 値は無視されます。 |
ExecuteIn |
はい | コマンドの実行環境を指定します。 - console : (デフォルト) コマンドラインへの直接入力と同様に、Arguments 値を使用して Target 属性を実行します。 Target 属性の実行中は、コマンド ウィンドウが表示され、自動的に閉じます。 - consolepause : console と同じ動作を示しますが、キーを押すまで、ウィンドウが開いたままになります。 - output : Target 属性を実行し、Visual Studio の出力ウィンドウに実行結果を表示します。 TargetType 属性が pip の場合、Target 属性がパッケージ名として使用され、Arguments 属性値が追加されます。 - repl : Python インタラクティブ ウィンドウで Target 属性を実行します。 オプションの表示名がウィンドウ タイトルに使用されます。 - none : console と同じ動作を示します。 |
WorkingDirectory |
省略可能 | コマンドを実行するフォルダーを指定します。 |
ErrorRegex WarningRegEx |
省略可能 | ExecuteIn 属性を output に設定している場合にのみ使用でき、 どちらの属性値にも正規表現を指定します。これによって、コマンド出力が解析され、[エラー一覧] ウィンドウにエラーと警告が表示されます。 これらの属性を指定していない場合、コマンドによって [エラー一覧] ウィンドウの動作が変わることはありません。 Visual Studio が想定する値の詳細については、「正規表現の名前付きキャプチャ グループ」を参照してください。 |
RequiredPackages |
省略可能 | requirements.txt ファイル (pip.readthedocs.io) と同じ形式を使用して、コマンドのパッケージ要件リストを指定します。 たとえば、[PyLint の実行] コマンドでは pylint>=1.0.0 という形式を指定します。 コマンドの実行前に、リスト内のパッケージがすべてインストールされているかどうかが確認されます。 Visual Studio は、pip を使ってすべての足りないパッケージをインストールします。 |
Environment |
省略可能 | コマンド実行の前に定義する環境変数の文字列を指定します。 各変数では \<NAME>=\<VALUE> の形式を使い、複数の変数はセミコロンで区切ります。 複数の値を持つ変数は、一重引用符または二重引用符で囲む必要があります (例: 'NAME=VALUE1;VALUE2' )。 |
正規表現の名前付きキャプチャ グループ
カスタム コマンドの出力からエラーと警告を解析して、次の名前付きグループを使用するには、ErrorRegex
と WarningRegex
の属性値に正規表現を記述する必要があります。
(?<message>...)
: エラーのテキスト(?<code>...)
: エラー コードの値(?<filename>...)
: エラーが報告されたファイルの名前(?<line>...)
: エラーが報告された、ファイル内の場所の行番号。(?<column>...)
: エラーが報告された、ファイル内の場所の列番号。
たとえば、PyLint は次の形式の警告を生成します。
************* Module hello
C: 1, 0: Missing module docstring (missing-docstring)
こうした警告から適切な情報を抽出して [エラー一覧] ウィンドウに表示するには、[Pylint の実行] コマンドの WarningRegex
属性値を次のように指定します。
^(?<filename>.+?)\((?<line>\d+),(?<column>\d+)\): warning (?<msg_id>.+?): (?<message>.+?)$]]
Note
msg_id
属性値の WarningRegex
構文では、issue 3680 で説明されているように code
を指定する必要があります。
ターゲット ファイルを使用して、カスタム コマンドをインポートする
Python プロジェクト ファイルで定義したカスタム コマンドは、その特定のプロジェクトでしか使用できません。 カスタム コマンドを作成し、複数のプロジェクトで使用するには、<PythonCommands>
プロパティ グループとすべての <Target>
要素をターゲット ファイル (.targets) で定義して、そのファイルを 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>
ターゲット ファイルをプロジェクトにインポートするには、プロジェクト ファイルにある
<Project>
要素内の任意の場所に<Import Project="(path)">
要素を追加します。たとえば、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=""--msg-template={abspath}({line},{column}): warning {msg_id}: {msg} [{C}:{symbol}]" -r n @(Compile, ' ')"
WorkingDirectory="$(MSBuildProjectDirectory)"
ExecuteIn="output"
RequiredPackages="pylint>=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>
consolepause で実行可能ファイルを実行する
次のコマンドでは、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 プロジェクトの [サーバーの起動] と [デバッグ サーバーの開始] のコマンドがどのように定義されているかを確認するには、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 "$(InstallerTitle)" --dist-dir="$(DistributionOutputDir)""
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="$(DistributionOutputDir)""
WorkingDirectory="$(WorkingDirectory)" RequiredPackages="wheel;setuptools"
ExecuteIn="Repl:Generate Wheel Package">
<Output TaskParameter="Command" ItemName="Commands" />
</CreatePythonCommandItem>
</Target>
fxthomas/Example.pyproj.xml (GitHub) から。アクセス許可を得て使用。
カスタム コマンドのトラブルシューティング
このセクションでは、カスタム コマンドの操作に関連して生じる可能性のある問題について説明します。
プロジェクト ファイルが読み込まれない
このエラー メッセージは、プロジェクト ファイルに構文エラーがあることを示します。 メッセージには、具体的なエラー、行番号、文字位置が含まれています。
コマンドの実行後にコンソール ウィンドウが閉じる
コマンドの実行直後にコンソール ウィンドウが閉じる場合は、ExecuteIn="console"
属性ではなく、ExecuteIn="consolepause"
属性を使用します。
メニューにコマンドが表示されない
Python コンテキスト メニューにカスタム コマンドが表示されない場合は、次の点を確認してください。
- コマンドが
<PythonCommands>
プロパティ グループに含まれていることを確認します。 - コマンド リストで定義したコマンド名が、
<Target>
要素で指定した名前と一致することを確認します。
次に例を示します。 次の XML スニペットでは、<PythonCommands>
プロパティ グループの Example
という名が、<Target>
要素定義の ExampleCommand
という名前と一致しません。 Example
という名前のコマンドが見つからないため、コマンドが表示されません。 コマンド リストで ExampleCommand
という名前を使用するか、Example
のみになるようにターゲットの名前を変更します。
<PropertyGroup>
<PythonCommands>$(PythonCommands);Example</PythonCommands>
</PropertyGroup>
<Target Name="ExampleCommand" Label="Example Command" Returns="@(Commands)">
<!-- ... -->
</Target>
コマンド実行中にエラーが発生し、コマンド ターゲットを取得できない
このエラー メッセージは、<Target>
要素または <CreatePythonCommandItem>
要素の内容が正しくないことを示しています。
このエラーの原因として、以下が考えられます。
- 必須の
<Target>
要素属性が空です。 - 必須の
TargetType
属性が空か、認識されない値を含みます。 - 必須の
ExecuteIn
属性が空か、認識されない値を含みます。 ExecuteIn="output"
属性定義を設定せずに、ErrorRegex
またはWarningRegex
属性を指定しています。- 要素に認識されない属性が存在します。 たとえば、属性参照のスペルを
Argumnets
ではなくArguments
と誤って記述している可能性があります。
未定義のプロパティを参照する場合、属性値は、空にすることができます。 トークン $(StartupFile)
を使用するときに、プロジェクトでスタートアップ ファイルを定義していない場合、トークンは空の文字列として解決されます。 このような場合は、既定値を定義できます。 たとえば、Bottle、Flask、Django プロジェクトのテンプレートで定義した [サーバーの起動] と [デバッグ サーバーの開始] のコマンドでは、デフォルトで manage.py ファイルが使用されます (サーバーのスタートアップ ファイルをプロジェクト プロパティで指定していない場合)。
Visual Studio が応答しなくなり、クラッシュする
カスタム コマンドの実行時に Visual Studio が応答しなくなりクラッシュする場合は、ExecuteIn="output"
属性定義を使用してコンソール コマンドを実行している可能性があります。 その場合、出力の解析時にクラッシュする可能性があります。 こうした状況を避けるには、ExecuteIn="console"
属性定義を代わりに使用します。 詳細については、issue 3681 を参照してください。
コマンドが、操作可能なプログラムまたはバッチ ファイルとして認識されない
TargetType="executable"
属性定義を設定する場合、Target
属性の値には、プログラム名のみ (例: python
または python.exe
のみ) を引数なしで記述する必要があります。 この場合、引数はすべて Arguments
属性で指定します。