Udostępnij za pośrednictwem


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

Podczas opracowywania projektów w języku Python możesz przejść do okna poleceń, aby uruchamiać 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ć polecenia niestandardowe do menu projektu języka 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.

Wymagania wstępne

Program Visual Studio dla komputerów Mac nie jest obsługiwany. 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 języka Python zawiera dwa polecenia: Uruchom narzędzie PyLint i Uruchom narzędzie Mypy:

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

Niestandardowe polecenia Pythona, które zdefiniujesz, pojawią się w tym menu. Polecenie niestandardowe może odnosić się do pliku Python, modułu Python, kodu Python w linii, dowolnego pliku wykonywalnego lub polecenia pip. Możesz również określić, jak i gdzie uruchamiasz polecenie.

Polecenia niestandardowe można dodawać na kilka sposobów:

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

  • Zdefiniuj polecenia niestandardowe w pliku docelowym (.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: Uruchom serwer i Uruchom serwer debugowania. 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. W podobny sposób, 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 języka Python i wybierz polecenie Zwolnij projekt.

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

    Jeśli plik projektu nie zostanie otwarty, ponownie kliknij prawym przyciskiem myszy projekt języka Python i wybierz polecenie 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 zwolniony projekt i wybierz polecenie 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 edytowania, zapisywania, ponownego ładowania i zwalniania może stać się uciążliwy podczas tworzenia komend 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, na przykład innej instancji programu Visual Studio, Visual Studio Code, Notatnika 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 Załaduj ponownie lub Załaduj wszystko ponownie, a program Visual Studio natychmiast zastosuje zmiany w pliku projektu do otwartego projektu.

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 przy użyciu polecenia python.exe, co odpowiada opcji Debuguj>Uruchom bez debugowania na głównym pasku narzędzi programu 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ę Python i zwróć uwagę na polecenia w menu kontekstowym. Obecnie jedynymi poleceniami w menu kontekstowym są Uruchom narzędzie PyLint i Uruchom narzędzie 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 języka Python, wybierz pozycję Python i sprawdź polecenia w menu kontekstowym.

    W menu kontekstowym nadal są wyświetlane tylko polecenia Uruchom narzędzie PyLint i Uruchom narzędzie Mypy . Właśnie dodany kod do pliku projektu replikuje domyślną <PythonCommands> grupę właściwości 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ą <Target> definicję elementu w elemecie <Project> . Definicję <Target> można umieścić przed lub po definicji opisanej <PropertyGroup> wcześniej.

    Ten <Target> element definiuje niestandardowe polecenie do uruchamiania pliku uruchamiania dla projektu (zidentyfikowanego przez właściwość StartupFile ) przy użyciu python.exe polecenia w oknie konsoli. Definicja ExecuteIn="consolepause" atrybutu 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ę <PythonCommands> właściwości (dodaną w kroku 5) następującym kodem XML. Ta składnia Name definiuje atrybut elementu <Target> , który dodaje polecenie niestandardowe do menu kontekstowego języka Python . Polecenie ma etykietę menu Uruchom plik startowy.

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

    Wskazówka

    Jeśli chcesz, aby niestandardowe polecenie było wyświetlane w menu kontekstowym przed domyślnymi poleceniami zdefiniowanymi w tokenie $(PythonCommands) , umieść składnię <Target> polecenia 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 pozycję Python i ponownie sprawdź polecenia w menu kontekstowym.

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

  12. Wybierz polecenie Uruchom plik startowy . Zostanie otwarte okno konsoli i zostanie wyświetlony tekst Witaj niestandardowe polecenia, a następnie naciśnij dowolny klawisz, aby kontynuować. Potwierdź dane wyjściowe i zamknij okno konsoli.

    Uwaga / Notatka

    Skrypt polecenia niestandardowego jest uruchamiany w aktywowanym środowisku dla projektu Python.

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

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

  15. Ponownie wybierz polecenie niestandardowe Uruchom plik startowy z menu kontekstowego języka 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 niestandardowej komendy 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 $(), takim jak $(StartupFile) i $(MSBuildProjectDirectory). Aby uzyskać więcej informacji, zobacz właściwości programu MSBuild.

Jeśli wywołasz polecenie podobne ($StartupFile) do tego, które używa właściwości projektu, takich jak właściwość StartupFile , i 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.

Omówienie <struktury elementów docelowych>

Szczegóły polecenia niestandardowego można zdefiniować przy użyciu <Target> elementu . Ogólna forma <Target> elementu 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 dla elementu <Target>.

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

Atrybuty CreatePythonCommandItem

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

Attribute Wymagane Description
TargetType Tak Określa, co Target zawiera atrybut i jak wartość jest używana wraz z atrybutem Arguments :
- executable: Uruchom plik wykonywalny o nazwie podanej w atrybucie Target, dodając wartość z atrybutu 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 z wartością w atrybucie Arguments.
- module: Aby uruchomić polecenie python -m, najpierw podaj 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: Uruchomić pip z komendą w atrybucie Target, a następnie wartość w atrybucie Arguments. Jeśli atrybut ExecuteIn jest ustawiony na output, pip zakłada, że żądanie ma uruchomić polecenie install i używa atrybutu Target jako nazwy 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 Opcjonalnie Udostępnia ciąg argumentów (jeśli istnieje) do użycia z atrybutem Target .
- Gdy wartość atrybutu TargetType to script, wartość Arguments jest dostarczana do programu Python, a nie do polecenia python.exe.
- Gdy wartość atrybutu TargetType to code, Arguments wartość jest ignorowana.
ExecuteIn Tak Określa środowisko, w którym ma zostać uruchomione polecenie:
- console: (Ustawienie domyślne) Uruchamia Target atrybut z wartością Arguments tak, jakby zostały wprowadzone bezpośrednio w wierszu polecenia. Target Gdy atrybut jest uruchomiony, zostanie wyświetlone okno polecenia i zostanie zamknięte automatycznie.
- consolepause: takie samo zachowanie jak console, ale czeka na naciśnięcie przed zamknięciem okna.
- output: uruchamia Target atrybut i wyświetla wyniki w oknie Dane wyjściowe programu Visual Studio. TargetType Jeśli atrybut to pip, program Visual Studio używa atrybutu Target jako nazwy pakietu i dołącza wartość atrybutuArguments.
- repl: uruchamia Target atrybut w oknie interaktywnym języka Python. Opcjonalna nazwa wyświetlana jest używana jako tytuł okna.
- none: takie samo zachowanie jak console.
WorkingDirectory Opcjonalnie Identyfikuje folder, w którym ma zostać uruchomione polecenie.
ErrorRegex
WarningRegEx
Opcjonalnie Używane tylko wtedy, gdy ExecuteIn atrybut 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 Lista błędów . Jeśli te atrybuty nie są określone, polecenie nie ma wpływu na okno Lista błędów . Aby uzyskać więcej informacji na temat wymagań programu Visual Studio, zobacz Nazwane grupy przechwytywania.
RequiredPackages Opcjonalnie Zawiera listę wymagań dotyczących pakietu dla 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. Visual Studio używa narzędzia pip, aby zainstalować brakujące pakiety.
Environment Opcjonalnie Identyfikuje ciąg zmiennych środowiskowych do zdefiniowania przed uruchomieniem polecenia. Każda zmienna używa formularza \<NAME>=\<VALUE> z wieloma zmiennymi oddzielonymi ś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 atrybutach ErrorRegex i WarningRegex będą używać następujących nazwanych grup:

  • (?<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 Lista błędów , WarningRegex wartość atrybutu dla polecenia Uruchom Pylint jest następująca:

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

Uwaga / Notatka

Składnia msg_id w wartości atrybutu WarningRegex powinna być faktycznie code, zgodnie z opisem w Problemu 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żywać ich w wielu projektach, możesz zdefiniować grupę <PythonCommands> właściwości ze wszystkimi <Target> elementami 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 <Import Project="(path)"> element w dowolnym miejscu w <Project> pliku projektu.

    Jeśli na przykład masz plik projektu o nazwie CustomCommands.targets w folderze targets 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, gdy projekt jest otwarty w programie Visual Studio, musisz ponownie skompilowaćrozwiązanie programu Visual Studio zawierające 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 narzędzie PyLint (element docelowy modułu)

W pliku Microsoft.PythonTools.targets zostanie wyświetlony następujący kod:

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

Wykonaj pip install z określonym pakietem (cel)

Następujące polecenie uruchamia polecenie pip install my-package w oknie Wyjście 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 install polecenie, 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 pip z funkcją list, aby zidentyfikować nieaktualne pakiety:

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

Uruchamianie pliku wykonywalnego z wstrzymaniem konsoli

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 są zdefiniowane polecenia uruchamiania serwera i uruchamiania serwera debugowania 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 w celu zainstalowania pakietów:

<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 pliku fxthomas/Example.pyproj.xml (GitHub) używanego z uprawnieniami.

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 pliku fxthomas/Example.pyproj.xml (GitHub) używanego z uprawnieniami.

Tworzenie pakietu Wheel dla Pythona

Poniższy skrypt generuje pakiet w formacie wheel dla Pythona:

<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 pliku fxthomas/Example.pyproj.xml (GitHub) używanego z uprawnieniami.

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

Polecenie nie jest dostępne w menu

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

  • Upewnij się, że polecenie znajduje się w <PythonCommands> grupie właściwości.
  • 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 polecenia 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 udało się uzyskać celu polecenia

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

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

  • Wymagany <Target> atrybut elementu jest pusty.
  • Wymagany TargetType atrybut jest pusty lub zawiera nierozpoznaną wartość.
  • Wymagany ExecuteIn atrybut jest pusty lub zawiera nierozpoznaną wartość.
  • Atrybut ErrorRegex or 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 zamiast 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 uruchamiania, 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 uruchamiania 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 Problem 3681.

Polecenie nie jest rozpoznawane jako program operacyjny lub plik wsadowy

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