Поделиться через


Определение пользовательских команд для проектов Python в Visual Studio

При разработке проектов Python вы можете переключиться в командное окно для выполнения определенных скриптов или модулей, выполнения команд pip или использования других средств с кодом. Чтобы улучшить рабочий процесс, можно добавить пользовательские команды в меню проекта Python в Visual Studio. Пользовательские команды Python могут выполняться в окне консоли или в окне вывода Visual Studio. Вы также можете использовать регулярные выражения, чтобы указать Visual Studio, как анализировать ошибки и предупреждения из выходных данных команды.

Предпосылки

Visual Studio для Mac не поддерживается. Visual Studio Code в Windows, Mac и Linux хорошо работает с Python с помощью доступных расширений.

Исследуйте пользовательские команды

По умолчанию меню проекта Python содержит две команды : Запустите PyLint и Run Mypy:

Снимок экрана: команды по умолчанию в меню проекта Python в Visual Studio 2022.

Все пользовательские команды Python, которые вы определили, появляются в этом же меню. Пользовательская команда может ссылаться на файл Python, модуль Python, встроенный код Python, произвольный исполняемый файл или команду pip. Вы также можете указать, как и где выполняется команда.

Вы можете добавить пользовательские команды несколькими способами:

  • Определите пользовательские команды непосредственно в файле проекта Python (PYPROJ). Эти команды применяются к конкретному проекту.

  • Определите пользовательские команды в файле целевых объектов (.targets). Команды в этом файле можно легко импортировать, чтобы использовать их с несколькими проектами.

  • Создайте проект Python из шаблона проекта в Visual Studio, который определяет пользовательские команды Python.

    Некоторые шаблоны проектов Python в Visual Studio добавляют пользовательские команды с помощью файла целей. Шаблоны веб-проектов "Бутылка" и "Веб-проект Flask" добавляют две команды: "Пуск" и "Запуск сервера отладки". Шаблон веб-проекта Django добавляет следующие команды и несколько других:

Перезагрузите проект для доступа к пользовательским командам

При открытии проекта в Visual Studio при внесении изменений в соответствующий файл проекта в редакторе необходимо перезагрузить проект, чтобы применить изменения. Аналогичным образом после определения пользовательских команд Python в файле проекта Python необходимо перезагрузить проект Python, чтобы команды отображались в меню проекта Python . При изменении пользовательских команд, определенных в целевом файле, необходимо перестроить полное решение Visual Studio для любого проекта, который импортирует этот целевой файл.

Распространенный подход заключается в внесении изменений в файл проекта Python непосредственно в Visual Studio:

  1. Откройте проект Python в Visual Studio. (При открытии проекта в 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) в редакторе. (Не забудьте открыть файл проекта (PYPROJ) и не файл приложения Python (.py).)

  5. В файле проекта найдите закрывающий элемент в конце файла и добавьте следующий XML-код непосредственно перед закрывающим </Project> элементом:

    <PropertyGroup>
      <PythonCommands>
        $(PythonCommands);
      </PythonCommands>
    </PropertyGroup>
    
  6. Сохраните изменения файла проекта и вернитесь в Visual Studio. Visual Studio обнаруживает изменения файла проекта и запрашивает действия. В командной строке выберите "Перезагрузить ", чтобы обновить открытый проект с изменениями файла проекта.

  7. В обозревателе решений щелкните правой кнопкой мыши проект Python, выберите Python и проверьте команды в контекстном меню.

    Контекстное меню по-прежнему отображает только команды Run PyLint и Run Mypy . Только что добавленный в файл проекта код просто реплицирует группу свойств по умолчанию <PythonCommands> , содержащую команду PyLint . На следующем шаге вы добавите дополнительный код для пользовательской команды.

  8. Перейдите в редактор, в котором обновляется файл проекта. Добавьте следующее определение элемента <Target> в элемент <Project>. Определение <Target> можно разместить до или после определения <PropertyGroup>, описанного выше.

    Этот <Target> элемент определяет пользовательскую команду для запуска файла запуска проекта (определяемого свойством StartupFile ) с помощью 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>, который добавляет пользовательскую команду в контекстное меню Python. В команде есть метка меню Запуск файла запуска.

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

    Подсказка

    Если вы хотите, чтобы пользовательская команда отображалась в контекстном меню перед командами по умолчанию, определенными в маркере $(PythonCommands) , поместите <Target> синтаксис команды перед этим маркером.

  10. Сохраните изменения файла проекта и вернитесь в Visual Studio. На приглашении командной строки перезагрузите ваш проект.

  11. В обозревателе решений щелкните правой кнопкой мыши проект Python, выберите Python и проверьте команды в контекстном меню.

    Теперь настраиваемая команда запуска файла запуска находится в меню. Если пользовательская команда не отображается, убедитесь, что вы добавили значение атрибута Name элемента <Target> в элемент <PythonCommands>, как описано в шаге 9. Также ознакомьтесь с рекомендациями, перечисленными в разделе "Устранение неполадок " далее в этой статье.

  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> группу свойств, чтобы команда отображалась в контекстном меню Python .
Label Да Имя интерфейса пользователя, отображаемое в контекстном меню Python.
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: выполните pip с командой, указанной в атрибуте Target, затем выполните значение, указанное в атрибуте Arguments. Если для атрибута ExecuteIn установлено значение output, pip предполагает, что запрос предназначен для выполнения install команды и использует атрибут Target как имя пакета.
Target Да Указывает имя файла, имя модуля, код или команду pip, используемую в зависимости от значения атрибута TargetType .
Arguments Необязательно Предоставляет строку аргументов (при наличии) для использования с атрибутом Target .
— Если значение атрибута TargetType равно script, Arguments значение предоставляется программе Python, а не команде python.exe .
— Если значение атрибута TargetType равно code, Arguments значение игнорируется.
ExecuteIn Да Указывает среду, в которой выполняется команда:
- console: (По умолчанию) Выполняет атрибут Target с значением Arguments, как при непосредственном вводе в командной строке. Во время выполнения атрибута Target откроется командное окно и закрывается автоматически.
- consolepause: аналогичное поведение console, но ожидает нажатия клавиши перед закрытием окна.
- output: запускает Target атрибут и отображает результаты в окне вывода Visual Studio. TargetType Если атрибут имеет значениеpip, Visual Studio использует Target атрибут в качестве имени пакета и добавляет значение атрибутаArguments.
- repl: запускает Target атрибут в интерактивном окне Python. Необязательное отображаемое имя используется для заголовка окна.
- none: то же поведение, что и console.
WorkingDirectory Необязательно Определяет папку, в которой выполняется команда.
ErrorRegex
WarningRegEx
Необязательно Используется только в том случае, если ExecuteIn для атрибута задано значение output. Оба значения атрибута указывают регулярное выражение, которое Visual Studio использует для анализа выходных данных команды и отображения ошибок и предупреждений в окне списка ошибок . Если эти атрибуты не указаны, команда не влияет на окно списка ошибок . Дополнительные сведения о том, что ожидает Visual Studio, см. в разделе "Именованные группы записи".
RequiredPackages Необязательно Предоставляет список требований к пакету для команды, используя тот же формат, что и файл requirements.txt (pip.readthedocs.io). Например, команда Run 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 значение атрибута для команды Run Pylint выглядит следующим образом:

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

Замечание

Синтаксис msg_id в значении атрибута должен фактически быть WarningRegex, как описано в 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>
    
  • Чтобы импортировать файл targets в проект, добавьте элемент <Import Project="(path)"> в любом месте элемента <Project> в файле проекта.

    Например, если у вас есть файл проекта с именем CustomCommands.targets в папке целевых объектов в проекте Python, добавьте следующий код в файл проекта:

    <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)

Следующая команда выполняет pip install my-package команду в окне вывода Visual Studio. Вы можете использовать следующую команду при разработке пакета и тестировании его установки. Элемент <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)

Следующая команда запускает pip с list функцией для идентификации устаревших пакетов 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>

Запуск сервера и выполнение команд сервера отладки

Чтобы узнать, как определены команды сервера запуска и запуска отладочного сервера для веб-проектов, изучите репозиторий Microsoft.PythonTools.Web.targets на сайте GitHub.

Установка пакета для разработки

Следующий код запускает 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), используемого с разрешением.

Создание wheel-пакета для 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> .

Вот пример. В следующем фрагменте Example XML имя в <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 атрибут.