Udostępnij za pośrednictwem


Definiowanie poleceń niestandardowych dla projektów języka Python w programie Visual Studio

Podczas opracowywania projektów w Pythonie, możesz przejść do okna poleceń, aby wykonywać określone skrypty lub moduły, uruchamiać polecenia pip lub używać innych narzędzi do pracy z kodem. Aby ulepszyć przepływ pracy, możesz dodać niestandardowe polecenia do menu projektu Python w programie Visual Studio. Niestandardowe polecenia języka Python mogą być uruchamiane w oknie konsoli lub w oknie dane wyjściowe programu Visual Studio. Możesz również użyć wyrażeń regularnych, aby poinstruować program Visual Studio, jak analizować błędy i ostrzeżenia z danych wyjściowych polecenia.

Warunki wstępne

Program Visual Studio dla komputerów Mac nie jest obsługiwany. Aby uzyskać więcej informacji, zobacz Co się dzieje z programem Visual Studio dla komputerów Mac? program Visual Studio Code w systemach Windows, Mac i Linux dobrze współpracuje z językiem Python za pośrednictwem dostępnych rozszerzeń.

Eksplorowanie poleceń niestandardowych

Domyślnie menu projektu Python zawiera dwa polecenia, Uruchom PyLint i UruchomMypy:

Zrzut ekranu przedstawiający domyślne polecenia w menu projektu języka Python w programie Visual Studio 2022.

Zrzut ekranu przedstawiający domyślne polecenia w menu projektu języka Python w programie Visual Studio.

Dowolne niestandardowe polecenia języka Python, które zdefiniujesz, pojawią się w tym samym menu. Polecenie niestandardowe może odwoływać się do pliku Python, modułu Python, wbudowanego kodu Python, dowolnego pliku wykonywalnego lub polecenia pip. Możesz również określić, w jaki sposób i gdzie uruchamiane jest polecenie.

Możesz dodawać polecenia niestandardowe na kilka sposobów:

  • Zdefiniuj polecenia niestandardowe w pliku projektu języka Python (.pyproj) bezpośrednio. Te polecenia dotyczą tego konkretnego projektu.

  • Zdefiniuj polecenia niestandardowe w pliku .targets (.targets). Możesz łatwo zaimportować polecenia w tym pliku, aby używać ich z wieloma projektami.

  • Utwórz projekt w języku Python na podstawie szablonu projektu w programie Visual Studio, który definiuje niestandardowe polecenia języka Python.

    Niektóre szablony projektów języka Python w programie Visual Studio dodają polecenia niestandardowe przy użyciu pliku targets. Szablony Bottle Web Project i Flask Web Project dodają dwa polecenia, Start server i Start debug server. Szablon projektu internetowego Django dodaje następujące polecenia i kilka innych:

Załaduj ponownie projekt, aby uzyskać dostęp do poleceń niestandardowych

Jeśli projekt zostanie otwarty w programie Visual Studio, jeśli wprowadzisz zmiany w odpowiednim pliku projektu w edytorze, musisz ponownie załadować projekt, aby zastosować zmiany. Podobnie, po zdefiniowaniu niestandardowych poleceń w pliku projektu języka Python, należy ponownie załadować projekt, aby polecenia pojawiły się w menu projektu Python. Podczas modyfikowania poleceń niestandardowych zdefiniowanych w pliku docelowym należy ponownie skompilować pełne rozwiązanie programu Visual Studio dla dowolnego projektu, który importuje ten plik docelowy.

Typowym podejściem jest wprowadzenie zmian w pliku projektu języka Python bezpośrednio w programie Visual Studio:

  1. Otwórz projekt w języku Python w programie Visual Studio. (Po otwarciu projektu w programie Visual Studio projekt jest domyślnie ładowany).

  2. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt Python i wybierz pozycję Odładuj projekt.

    Program Visual Studio zwalnia projekt i otwiera odpowiedni plik projektu w języku Python (.pyproj) w edytorze.

    Jeśli plik projektu nie zostanie otwarty, ponownie kliknij prawym przyciskiem myszy projekt języka Python i wybierz Edytuj plik projektu:

  3. Wprowadź zmiany w pliku projektu w edytorze programu Visual Studio i zapisz swoją pracę.

  4. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy niezaładowany projekt i wybierz Załaduj ponownie projekt. Jeśli spróbujesz ponownie załadować projekt bez zapisywania zmian w pliku projektu, program Visual Studio wyświetli monit o ukończenie akcji.

Proces rozładunku, edycji, zapisu i ponownego ładowania może stać się żmudny podczas tworzenia poleceń niestandardowych. Bardziej wydajny przepływ pracy obejmuje jednoczesne ładowanie projektu w programie Visual Studio i otwieranie pliku projektu w języku Python w osobnym edytorze. Możesz użyć dowolnego edytora, takiego jak inne wystąpienie programu Visual Studio, Visual Studio Code, Notatnik itd. Po zapisaniu zmian w edytorze i przełączeniu się z powrotem do programu Visual Studio program Visual Studio wykrywa zmiany pliku projektu dla otwartego projektu i monituje o podjęcie akcji:

Zrzut ekranu przedstawiający monit programu Visual Studio po wykryciu zmian w pliku projektu dla otwartego projektu.

Wybierz pozycję Załaduj ponownie lub Załaduj ponownie wszystkie, a program Visual Studio natychmiast zastosuje zmiany w pliku projektu do projektu otwartego.

Dodawanie poleceń niestandardowych z plikiem projektu

Poniższa procedura przedstawia sposób tworzenia polecenia niestandardowego przez dodanie definicji w pliku projektu języka Python (.pyproj) i ponowne załadowanie projektu w programie Visual Studio. Polecenie niestandardowe uruchamia plik startowy projektu bezpośrednio za pomocą polecenia python.exe, które jest zasadniczo takie samo jak użycie opcji Debugowanie>Uruchom bez debugowania na głównym pasku narzędzi Visual Studio.

  1. W programie Visual Studio utwórz nowy projekt w języku Python o nazwie Python-CustomCommands przy użyciu szablonu aplikacji języka Python . Aby uzyskać instrukcje, zobacz Szybki start: tworzenie projektu w języku Python na podstawie szablonu.

    Program Visual Studio tworzy projekt w języku Python i ładuje go do sesji. Projekt można skonfigurować za pomocą pliku projektu (.pyproj). Ten plik jest widoczny tylko w programie Visual Studio, gdy projekt jest otwarty, ale niezaładowany. Projekt zawiera również plik języka Python (.py) dla kodu aplikacji.

  2. Otwórz plik aplikacji Python_CustomCommands.py w edytorze i dodaj następujący kod:

    print("Hello custom commands")
    
  3. W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt języka Python, wybierz pozycję Pythoni zwróć uwagę na polecenia w menu kontekstowym. Obecnie jedynymi poleceniami w menu kontekstowym są Run PyLint i Run Mypy. Podczas definiowania poleceń niestandardowych są one również wyświetlane w tym menu.

  4. Uruchom oddzielny edytor poza sesją programu Visual Studio i otwórz plik projektu języka Python (Python-CustomCommands.pyproj) w edytorze. (Pamiętaj, aby otworzyć plik projektu (.pyproj), a nie plik aplikacji języka Python (.py).)

  5. W pliku projektu znajdź element zamykający </Project> na końcu pliku i dodaj następujący kod XML bezpośrednio przed elementem zamykającym:

    <PropertyGroup>
      <PythonCommands>
        $(PythonCommands);
      </PythonCommands>
    </PropertyGroup>
    
  6. Zapisz zmiany w pliku projektu i wróć do programu Visual Studio. Program Visual Studio wykrywa zmiany w pliku projektu i monituje o podjęcie akcji. Po wyświetleniu monitu wybierz pozycję Załaduj ponownie, aby zaktualizować otwarty projekt za pomocą zmian w pliku projektu.

  7. W Eksploratorze rozwiązańkliknij prawym przyciskiem myszy projekt Python, wybierz Pythoni sprawdź polecenia w menu kontekstowym.

    W menu kontekstowym nadal są wyświetlane tylko polecenia Run PyLint i Run Mypy. Właśnie dodany kod do pliku projektu replikuje domyślną grupę właściwości <PythonCommands> zawierającą polecenie PyLint. W następnym kroku dodasz więcej kodu dla polecenia niestandardowego.

  8. Przejdź do edytora, w którym aktualizujesz plik projektu. Dodaj następującą definicję elementu <Target> w elemecie <Project>. Definicję <Target> można ustawić przed lub po opisanej wcześniej definicji <PropertyGroup>.

    Ten element <Target> definiuje niestandardowe polecenie, aby uruchomić plik startowy dla projektu (zidentyfikowany przez właściwość StartupFile) przy użyciu polecenia python.exe w oknie konsoli. Definicja atrybutu ExecuteIn="consolepause" używa konsoli, która czeka na wybranie klucza w celu zamknięcia okna konsoli.

    <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. Zastąp grupę właściwości <PythonCommands> (dodaną w kroku 5) następującym kodem XML. Ta składnia definiuje atrybut Name dla elementu <Target>, który dodaje polecenie niestandardowe do menu kontekstowego Python. Polecenie ma etykietę menu Uruchom plik startowy.

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

    Napiwek

    Jeśli chcesz, aby niestandardowe polecenie było wyświetlane w menu kontekstowym przed domyślnymi poleceniami zdefiniowanymi w tokenie $(PythonCommands), umieść składnię polecenia <Target> przed tym tokenem.

  10. Zapisz zmiany w pliku projektu i wróć do programu Visual Studio. Po wyświetleniu monitu załaduj ponownie projekt.

  11. W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt języka Python, wybierz pythoni ponownie sprawdź polecenia w menu kontekstowym.

    Teraz w menu znajduje się polecenie własne Uruchom plik startowy. Jeśli nie widzisz polecenia niestandardowego, upewnij się, że dodano wartość atrybutu Name dla elementu <Target> do elementu <PythonCommands> zgodnie z opisem w kroku 9. Zapoznaj się również z zagadnieniami wymienionymi w sekcji rozwiązywania problemów w dalszej części tego artykułu.

  12. Wybierz polecenie Uruchom plik startowy. Okno konsoli otwiera się i wyświetla tekst Hello polecenia niestandardowe, a następnie naciśnij dowolny klawisz, aby kontynuować. Potwierdź dane wyjściowe i zamknij okno konsoli.

    Notatka

    Skrypt polecenia niestandardowego uruchamia się w aktywowanym środowisku projektu Python.

  13. Przejdź do edytora przy użyciu pliku projektu. W definicji elementu (dodanej w kroku 8zmień wartość atrybutu na .

      <CreatePythonCommandItem
        ...
        ExecuteIn="output">
        ...
      </CreatePythonCommandItem>
    
  14. Zapisz zmiany, wróć do programu Visual Studio i załaduj ponownie projekt.

  15. Wybierz ponownie Uruchom niestandardowe polecenie pliku startowego z menu kontekstowego Python. Teraz dane wyjściowe programu są wyświetlane w oknie Dane wyjściowe programu Visual Studio , a nie w oknie konsoli:

  16. Aby dodać więcej poleceń niestandardowych, wykonaj ten sam proces:

    1. Zdefiniuj odpowiedni element <Target> dla polecenia niestandardowego w pliku projektu.

    2. Dodaj wartość atrybutu Name dla elementu <Target> do grupy właściwości <PythonCommands>.

    3. Zapisz zmiany w pliku projektu.

    4. Załaduj ponownie projekt w programie Visual Studio.

Korzystanie z właściwości projektu

Aby odwołać się do właściwości projektu lub zmiennych środowiskowych w wartościach atrybutów elementu <Target>, użyj nazwy właściwości w tokenie $(), na przykład $(StartupFile) i $(MSBuildProjectDirectory). Aby uzyskać więcej informacji, zobacz właściwości programu MSBuild.

Jeśli wywołasz polecenie, takie jak ($StartupFile) używające właściwości projektu, takich jak właściwość StartupFile, a polecenie zakończy się niepowodzeniem, ponieważ token jest niezdefiniowany, program Visual Studio wyłącza polecenie do momentu ponownego załadowania projektu. Jeśli wprowadzisz zmiany w projekcie modyfikujące definicję właściwości, zmiany nie odświeżą stanu powiązanego polecenia. W takim przypadku nadal trzeba ponownie załadować projekt.

Zrozumienie struktury elementów <targetu>

Szczegóły polecenia niestandardowego można zdefiniować przy użyciu elementu <Target>. Ogólna forma elementu <Target> jest wyświetlana w poniższym pseudokodzie:

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

Atrybuty docelowe

W poniższej tabeli wymieniono atrybuty elementu <Target>.

Atrybut Wymagane Opis
Name Tak Identyfikator polecenia w projekcie programu Visual Studio. Ta nazwa musi zostać dodana do grupy właściwości <PythonCommands>, aby polecenie było wyświetlane w menu kontekstowym Python.
Label Tak Nazwa wyświetlana interfejsu użytkownika, która pojawia się w menu kontekstowym Python.
Returns Tak Zwrócone informacje muszą zawierać token @(Commands), który identyfikuje cel jako polecenie.

Atrybuty „CreatePythonCommandItem”

Element <Target> zawiera elementy <CreatePythonCommandItem> i <Output>, które definiują szczegółowe zachowanie polecenia niestandardowego. W poniższej tabeli wymieniono dostępne atrybuty elementu <CreatePythonCommandItem>. Wszystkie wartości atrybutów są nieczułe na wielkość liter.

Attribute Wymagane Opis
TargetType Tak Określa, jaki atrybut Target zawiera i jak wartość jest używana wraz z atrybutem Arguments:
- executable: uruchom plik wykonywalny o nazwie w atrybucie Target, dołączając wartość w atrybucie Arguments, tak jakby został wprowadzony bezpośrednio w wierszu polecenia. Wartość musi zawierać tylko nazwę programu bez argumentów.
- script: uruchom polecenie python.exe z nazwą pliku w atrybucie Target, a następnie wartość w atrybucie Arguments.
- module: uruchom polecenie python -m, a następnie nazwę modułu w atrybucie Target, a następnie wartość w atrybucie Arguments.
- code: uruchom wbudowany kod zawarty w atrybucie Target. Ignoruj wartość atrybutu Arguments.
- pip: Uruchom pip za pomocą polecenia w atrybucie Target, a następnie użyj wartości z atrybutu Arguments. Jeśli atrybut ExecuteIn jest ustawiony na output, pip zakłada, że żądanie ma uruchomić polecenie install i wykorzystuje atrybut Target jako nazwę pakietu.
Target Tak Określa nazwę pliku, nazwę modułu, kod lub polecenie do użycia, w zależności od wartości atrybutu TargetType.
Arguments Fakultatywny Udostępnia ciąg argumentów (jeśli istnieje) używany z atrybutem Target.
- Gdy wartość atrybutu TargetType jest script, wartość Arguments jest przekazywana do programu Python, zamiast wartości python.exe polecenia.
- Gdy wartość atrybutu TargetType jest code, wartość Arguments jest ignorowana.
ExecuteIn Tak Określa środowisko, w którym ma zostać uruchomione polecenie:
- console: (Ustawienie domyślne) Uruchamia atrybut Target z wartością Arguments tak, jakby zostały wprowadzone bezpośrednio w wierszu polecenia. Gdy atrybut Target jest uruchomiony, zostanie wyświetlone okno polecenia i zostanie zamknięte automatycznie.
- consolepause: Działa tak samo jak console, ale czeka na naciśnięcie klawisza przed zamknięciem okna.
: uruchamia atrybut i wyświetla wyniki w oknie wyjściowym programu Visual Studio . Jeśli atrybut TargetType jest pip, program Visual Studio używa atrybutu Target jako nazwy pakietu i dołącza wartość atrybutu Arguments.
- repl: uruchamia atrybut Target w oknie interaktywnym języka Python . Opcjonalna nazwa wyświetlana jest używana jako tytuł okna.
- none: takie samo zachowanie jak console.
WorkingDirectory Fakultatywny Identyfikuje folder, w którym ma zostać uruchomione polecenie.
ErrorRegex
WarningRegEx
Fakultatywny Używane tylko wtedy, gdy atrybut ExecuteIn jest ustawiony na output. Obie wartości atrybutów określają wyrażenie regularne używane przez program Visual Studio do analizowania danych wyjściowych poleceń i pokazywania błędów i ostrzeżeń w oknie listy błędów . Jeśli te atrybuty nie są określone, polecenie nie ma wpływu na okno listy błędów. Aby uzyskać więcej informacji o oczekiwaniach środowiska Visual Studio, zobacz Nazwane grupy przechwytywania.
RequiredPackages Fakultatywny Zawiera listę wymagań dotyczących pakietu dla użycia polecenia przy użyciu tego samego formatu co plik requirements.txt (pip.readthedocs.io). Na przykład polecenie Run PyLint określa format pylint>=1.0.0. Przed uruchomieniem polecenia program Visual Studio potwierdza, że wszystkie pakiety na liście są zainstalowane. Program Visual Studio używa pip do zainstalowania wszelkich brakujących pakietów.
Environment Fakultatywny Identyfikuje ciąg zmiennych środowiskowych do zdefiniowania przed uruchomieniem polecenia. Każda zmienna używa formatu \<NAME>=\<VALUE>, a wiele zmiennych oddziela się średnikami. Zmienna z wieloma wartościami musi być zawarta w cudzysłowie pojedynczym lub podwójnym, jak w 'NAME=VALUE1;VALUE2'.

Nazwane grupy przechwytywania dla wyrażeń regularnych

Gdy program Visual Studio analizuje błędy i ostrzeżenia z niestandardowych danych wyjściowych poleceń, oczekuje, że wyrażenia regularne w wartościach atrybutów ErrorRegex i WarningRegex będą stosować następujące nazwane grupy:

  • (?<message>...): tekst błędu.
  • (?<code>...): wartość kodu błędu.
  • (?<filename>...): nazwa pliku, dla którego zgłaszany jest błąd.
  • (?<line>...): numer wiersza lokalizacji w pliku, dla którego zgłaszany jest błąd.
  • (?<column>...): numer kolumny lokalizacji w pliku, dla którego zgłaszany jest błąd.

Na przykład narzędzie PyLint generuje ostrzeżenia o następującej postaci:

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

Aby umożliwić programowi Visual Studio wyodrębnianie odpowiednich informacji z tych ostrzeżeń i wyświetlanie ich w oknie listy błędów , wartość atrybutu dla polecenia Uruchom Pylint jest następująca:

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

Notatka

Składnia msg_id w wartości atrybutu WarningRegex powinna być rzeczywiście code, zgodnie z opisem w kwestii 3680.

Importowanie poleceń niestandardowych z plikiem obiektów docelowych

Jeśli zdefiniujesz polecenia niestandardowe w pliku projektu języka Python, polecenia są dostępne tylko dla tego konkretnego projektu. Jeśli chcesz utworzyć polecenia niestandardowe i użyć ich w wielu projektach, możesz zdefiniować grupę właściwości <PythonCommands> ze wszystkimi elementami <Target> w pliku docelowym (.targets), a następnie zaimportować ten plik do projektów języka Python.

  • Plik targets używa tego samego formatu i składni, aby zdefiniować polecenia niestandardowe zgodnie z opisem dla pliku projektu języka Python (.pyproj). Typowe elementy do skonfigurowania obejmują <PythonCommands>, <Target>, <CreatePythonCommandItem>i <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>
    
  • Aby zaimportować plik docelowy do projektu, dodaj element <Import Project="(path)"> w dowolnym miejscu w elemecie <Project> w pliku projektu.

    Jeśli na przykład masz plik projektu o nazwie CustomCommands.targets w folderze obiektów docelowych w projekcie języka Python, dodaj następujący kod do pliku projektu:

    <Import Project="targets/CustomCommands.targets"/>
    
  • Jeśli plik projektu importuje plik docelowy i wprowadzasz zmiany w pliku docelowym podczas otwierania projektu w programie Visual Studio, musisz skompilować rozwiązanie programu Visual Studio , które zawiera projekt, a nie tylko projekt.

Przykładowe polecenia

W poniższych sekcjach przedstawiono przykładowy kod, którego można użyć do definiowania poleceń niestandardowych dla projektów języka Python.

Uruchom PyLint (moduł docelowy)

Poniższy kod pojawia się w pliku 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>

Uruchom pip install z określonym pakietem (cel dla pip)

Następujące polecenie uruchamia polecenie w oknie Dane wyjściowe programu Visual Studio . Podczas opracowywania pakietu i testowania jego instalacji możesz użyć polecenia takiego jak to. Element <Target> zawiera nazwę pakietu, a nie polecenie install, które jest zakładane podczas używania definicji atrybutu 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>

Pokaż nieaktualne pakiety pip (cel pip)

Następujące polecenie uruchamia program pip z funkcją list w celu zidentyfikowania nieaktualnych pakietów 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>

Uruchom plik wykonywalny z consolepause

Następujące polecenie uruchamia funkcję where, aby wyświetlić lokalizację plików języka Python rozpoczynających się od folderu projektu:

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

Uruchamianie serwera i uruchamianie poleceń serwera debugowania

Aby dowiedzieć się, jak zdefiniowano polecenia Start server i Start debug server dla projektów internetowych, zapoznaj się z repozytorium Microsoft.PythonTools.Web.targets w witrynie GitHub.

Instalowanie pakietu na potrzeby programowania

Następujący kod uruchamia pip, aby zainstalować pakiety:

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

z fxthomas/Example.pyproj.xml (GitHub), używane za zgodą.

Generowanie Instalatora Windows

Następujący skrypt generuje instalator systemu 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>

z fxthomas/Example.pyproj.xml (GitHub), używane za zgodą.

Generowanie pakietu typu wheel dla języka Python

Poniższy skrypt generuje pakiet Python wheel:

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

z fxthomas/Example.pyproj.xml (GitHub), używane za zgodą.

Rozwiązywanie problemów z poleceniami niestandardowymi

Zapoznaj się z poniższymi sekcjami, aby zapoznać się z możliwymi problemami związanymi z pracą z poleceniami niestandardowymi.

Nie załadowano pliku projektu

Ten komunikat o błędzie wskazuje, że w pliku projektu występują błędy składni. Komunikat zawiera konkretny błąd z numerem wiersza i pozycją znaku.

Okno konsoli zostanie zamknięte po uruchomieniu polecenia

Jeśli okno konsoli zostanie zamknięte natychmiast po uruchomieniu polecenia, użyj definicji atrybutu ExecuteIn="consolepause" zamiast ExecuteIn="console".

Brak polecenia z menu

Jeśli nie widzisz polecenia niestandardowego w menu kontekstowym Python, sprawdź następujące elementy:

  • Upewnij się, że polecenie znajduje się w grupie właściwości <PythonCommands>.
  • Sprawdź, czy nazwa polecenia zdefiniowana na liście poleceń jest zgodna z nazwą określoną w elemecie <Target>.

Oto przykład. W poniższym fragmencie kodu XML nazwa Example w grupie właściwości <PythonCommands> nie jest zgodna z nazwą ExampleCommand w definicji elementu <Target>. Program Visual Studio nie znajduje polecenia o nazwie Example, więc nie jest wyświetlane żadne polecenie. Użyj ExampleCommand na liście poleceń lub zmień nazwę obiektu docelowego na tylko Example.

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

Błąd podczas uruchamiania polecenia, nie można uzyskać celu polecenia

Ten komunikat o błędzie wskazuje, że zawartość elementów <Target> lub <CreatePythonCommandItem> jest niepoprawna.

Poniżej przedstawiono niektóre możliwe przyczyny tego błędu:

  • Wymagany atrybut elementu <Target> jest pusty.
  • Wymagany atrybut TargetType jest pusty lub zawiera nierozpoznaną wartość.
  • Wymagany atrybut ExecuteIn jest pusty lub zawiera nierozpoznaną wartość.
  • Atrybut ErrorRegex lub WarningRegex jest określony bez ustawiania definicji atrybutu ExecuteIn="output".
  • Nierozpoznane atrybuty istnieją w elemecie . Na przykład odwołanie do atrybutu może być błędnie napisane jako Argumnets, a nie Arguments.

Wartości atrybutów mogą być puste, jeśli odwołujesz się do właściwości, która jest niezdefiniowana. Jeśli używasz tokenu $(StartupFile), ale w projekcie nie zdefiniowano pliku startowego, token zostanie rozpoznany jako pusty ciąg. W takich przypadkach możesz zdefiniować wartość domyślną. Na przykład polecenia Uruchom serwer i Uruchom serwer debugowania, zdefiniowane w szablonach projektów Bottle, Flask i Django, domyślnie używają pliku manage.py (jeśli plik startowy serwera nie jest określony we właściwościach projektu).

Program Visual Studio przestaje odpowiadać, ulega awarii

Jeśli program Visual Studio przestaje odpowiadać i ulega awarii po uruchomieniu polecenia niestandardowego, prawdopodobnie próbujesz uruchomić polecenie konsoli z definicją atrybutu ExecuteIn="output". W takich przypadkach program Visual Studio może ulec awarii, gdy próbuje przeanalizować dane wyjściowe. Aby uniknąć tego warunku, należy zamiast tego użyć definicji atrybutu ExecuteIn="console". Aby uzyskać więcej informacji, zobacz Kwestia 3681.

Polecenie nie jest rozpoznawane jako program operacyjny lub plik wsadowy

Po ustawieniu definicji atrybutu TargetType="executable" wartość atrybutu Target musi być tylko nazwę programu bez żadnych argumentów, takich jak python lub tylko python.exe. W takim przypadku przenieś wszystkie argumenty do atrybutu Arguments.