Visual Studio에서 Python 프로젝트에 대한 사용자 지정 명령 정의

Python 프로젝트를 개발할 때 명령 창으로 전환하여 특정 스크립트 또는 모듈을 실행하거나, pip 명령을 실행하거나, 코드와 함께 다른 도구를 사용할 수 있습니다. 워크플로를 개선하기 위해 Visual Studio의 Python 프로젝트 메뉴에 사용자 지정 명령을 추가할 수 있습니다. 사용자 지정 Python 명령은 콘솔 창 또는 Visual Studio 출력 창에서 실행할 수 있습니다. 정규식을 사용하여 명령 출력에서 오류 및 경고를 구문 분석하는 방법을 Visual Studio에 지시할 수도 있습니다.

필수 조건

Mac용 Visual Studio는 지원되지 않습니다. Windows, Mac 및 Linux의 Visual Studio Code는 사용 가능한 확장을 통해 Python에서 잘 작동합니다.

사용자 지정 명령 살펴보기

기본적으로 Python 프로젝트 메뉴에는 PyLint 실행Mypy 실행이라는 두 가지 명령이 포함되어 있습니다.

Visual Studio 2022의 Python 프로젝트 메뉴에 있는 기본 명령을 보여 주는 스크린샷

정의한 모든 사용자 지정 Python 명령이 이 동일한 메뉴에 표시됩니다. 사용자 지정 명령은 Python 파일, Python 모듈, 인라인 Python 코드, 임의 실행 파일 또는 pip 명령을 참조할 수 있습니다. 명령이 실행되는 방법과 위치를 지정할 수도 있습니다.

다음과 같은 여러 가지 방법으로 사용자 지정 명령을 추가할 수 있습니다.

  • Python 프로젝트 파일(.pyproj)에서 직접 사용자 지정 명령을 정의합니다. 이러한 명령은 해당 특정 프로젝트에 적용됩니다.

  • 대상 파일(.targets)에서 사용자 지정 명령을 정의합니다. 이 파일의 명령을 쉽게 가져와 여러 프로젝트에서 사용할 수 있습니다.

  • 사용자 지정 Python 명령을 정의하는 Visual Studio의 프로젝트 템플릿에서 Python 프로젝트를 만듭니다.

    Visual Studio의 특정 Python 프로젝트 템플릿은 대상 파일을 사용하여 사용자 지정 명령을 추가합니다. Bottle 웹 프로젝트 및 Flask 웹 프로젝트 템플릿에는 시작 서버디버그 시작 서버의 두 가지 명령이 추가됩니다. Django 웹 프로젝트 템플릿은 다음 명령과 몇 가지 추가를 추가합니다.

사용자 지정 명령에 액세스하기 위해 프로젝트를 다시 로드합니다.

Visual Studio에서 프로젝트를 열 때 편집기에서 해당 프로젝트 파일을 변경하는 경우 변경 내용을 적용하려면 프로젝트를 다시 로드해야 합니다. 비슷한 방식으로 Python 프로젝트 파일에서 사용자 지정 Python 명령을 정의한 후에는 Python 프로젝트 메뉴에 표시할 명령에 대해 Python 프로젝트를 다시 로드해야 합니다. 대상 파일에 정의된 사용자 지정 명령을 수정하는 경우 대상 파일을 가져오는 모든 프로젝트에 대해 전체 Visual Studio 솔루션을 다시 빌드해야 합니다.

일반적인 방법은 Visual Studio에서 Python 프로젝트 파일을 직접 변경하는 것입니다.

  1. Visual Studio에서 Python 프로젝트를 엽니다. (Visual Studio에서 프로젝트를 열면 프로젝트가 기본적으로 로드됩니다 .)

  2. 솔루션 탐색기에서 Python 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 언로드를 선택합니다.

    Visual Studio는 프로젝트를 언로드하고 편집기에서 해당 Python 프로젝트 파일(.pyproj)을 엽니다.

    프로젝트 파일이 열리지 않으면 Python 프로젝트를 다시 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.

  3. Visual Studio 편집기에서 프로젝트 파일을 변경하고 작업을 저장합니다.

  4. 솔루션 탐색기에서 언로드된 프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 다시 로드를 선택합니다. 프로젝트 파일에 변경 내용을 저장하지 않고 프로젝트를 다시 로드하려고 하면 Visual Studio에서 작업을 완료하라는 메시지가 표시됩니다.

사용자 지정 명령을 개발할 때, 언로드-편집-저장-재로드 프로세스가 반복되면 지루해질 수 있습니다. 보다 효율적인 워크플로에는 Visual Studio에서 프로젝트를 동시에 로드하고 별도의 편집기에서 Python 프로젝트 파일을 여는 작업이 포함됩니다. Visual Studio, Visual Studio Code, 메모장 등의 다른 인스턴스와 같은 모든 편집기를 사용할 수 있습니다. 편집기에서 변경 내용을 저장하고 Visual Studio로 다시 전환하면 Visual Studio에서 열려 있는 프로젝트의 프로젝트 파일 변경 내용을 감지하고 작업을 수행하라는 메시지를 표시합니다.

열려 있는 프로젝트에 대한 프로젝트 파일의 변경 내용을 검색한 후 Visual Studio 프롬프트를 보여 주는 스크린샷.

모두 다시 로드 또는 다시 로드를 선택하면 Visual Studio에서 프로젝트 파일 변경 내용을 열려 있는 프로젝트에 즉시 적용합니다.

프로젝트 파일을 사용하여 사용자 지정 명령 추가

다음 절차에서는 Python 프로젝트 파일(.pyproj)에 정의를 추가하고 Visual Studio에서 프로젝트를 다시 로드하여 사용자 지정 명령을 만드는 방법을 보여 줍니다. 사용자 지정 명령은 기본 Visual Studio 도구 모음에서python.exe디버그> 시작 옵션을 사용하는 것과 기본적으로 동일한 명령을 사용하여 프로젝트의 시작 파일을 직접 실행합니다.

  1. Visual Studio에서 Python 애플리케이션 템플릿을 사용하여 Python-CustomCommands 라는 새 Python 프로젝트를 만듭니다. 자세한 내용은 빠른 시작: 템플릿에서 Python 프로젝트 만들기를 참조하세요.

    Visual Studio는 Python 프로젝트를 만들고 세션에 로드합니다. 프로젝트 파일(.pyproj)을 통해 프로젝트를 구성할 수 있습니다. 이 파일은 프로젝트가 열려 있지만 언로드된 경우에만 Visual Studio에서 볼 수 있습니다. 프로젝트에는 애플리케이션 코드에 대한 Python 파일(.py)도 있습니다.

  2. 편집기에서 Python_CustomCommands.py 애플리케이션 파일을 열고 다음 코드를 추가합니다.

    print("Hello custom commands")
    
  3. 솔루션 탐색기에서 Python 프로젝트를 마우스 오른쪽 단추로 클릭하고 Python을 선택한 다음 상황에 맞는 메뉴에서 명령을 확인합니다. 현재 상황에 맞는 메뉴의 유일한 명령은 PyLint 실행Mypy 실행입니다. 사용자 지정 명령을 정의하면 이 메뉴에도 표시됩니다.

  4. Visual Studio 세션 외부에서 별도의 편집기를 시작하고 편집기에서 Python 프로젝트 파일(Python-CustomCommands.pyproj)을 엽니다. Python 애플리케이션 파일(.py)이 아닌 프로젝트 파일(.pyproj)을 열어야 합니다.

  5. 프로젝트 파일에서 파일 끝에 있는 닫는 </Project> 요소를 찾아, 닫는 요소 바로 앞에 다음 XML을 추가합니다.

    <PropertyGroup>
      <PythonCommands>
        $(PythonCommands);
      </PythonCommands>
    </PropertyGroup>
    
  6. 프로젝트 파일 변경 내용을 저장하고 Visual Studio로 다시 전환합니다. Visual Studio에서 프로젝트 파일 변경 내용을 감지하고 작업을 수행하라는 메시지를 표시합니다. 프롬프트에서 다시 로드 를 선택하여 프로젝트 파일 변경 내용으로 열려 있는 프로젝트를 업데이트합니다.

  7. 솔루션 탐색기에서 Python 프로젝트를 마우스 오른쪽 단추로 클릭하고 Python을 선택한 다음 상황에 맞는 메뉴에서 명령을 확인합니다.

    상황에 맞는 메뉴에는 PyLint 실행Mypy 실행 명령만 표시됩니다. 프로젝트 파일에 방금 추가한 코드는 <PythonCommands> 명령이 포함된 기본 속성 그룹을 복제하기만 하면 됩니다. 다음 단계에서는 사용자 지정 명령에 대한 코드를 더 추가합니다.

  8. 프로젝트 파일을 업데이트하는 편집기로 전환합니다. 요소 내에 다음 <Target> 요소 정의를 추가합니다 <Project> . 앞서 설명한 <Target> 정의의 앞이나 뒤에 <PropertyGroup> 정의를 배치할 수 있습니다.

    <Target> 요소는 콘솔 창에서 명령을 사용하여 python.exe 속성으로 식별되는 프로젝트의 시작 파일을 실행하는 사용자 지정 명령을 정의합니다. 특성 정의 ExecuteIn="consolepause" 는 콘솔 창을 닫을 키를 선택할 때까지 기다리는 콘솔을 사용합니다.

    <Target Name="Example_RunStartupFile" Label="Run startup file" Returns="@(Commands)">
      <CreatePythonCommandItem
        TargetType="script"
        Target="$(StartupFile)"
        Arguments=""
        WorkingDirectory="$(MSBuildProjectDirectory)"
        ExecuteIn="consolepause">
        <Output TaskParameter="Command" ItemName="Commands" />
      </CreatePythonCommandItem>
    </Target>
    
  9. <PythonCommands> 속성 그룹(5단계에서 추가됨)을 다음 XML로 바꿉니다. 이 구문은 Name<Target> 상황에 맞는 메뉴에 사용자 지정 명령을 추가하는 요소의 특성을 정의합니다. 명령에는 시작 파일 실행 메뉴 레이블이 있습니다.

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

    팁 (조언)

    사용자 지정 명령이 $(PythonCommands) 토큰이 정의하는 기본 명령 앞에 상황에 맞는 메뉴에 나타나도록 하려면, 명령 구문 <Target>을 해당 토큰 앞에 배치하십시오.

  10. 프로젝트 파일 변경 내용을 저장하고 Visual Studio로 다시 전환합니다. 프롬프트에서 프로젝트를 다시 로드합니다.

  11. 솔루션 탐색기에서 Python 프로젝트를 마우스 오른쪽 단추로 클릭하고 Python을 선택한 다음 상황에 맞는 메뉴에서 명령을 다시 확인합니다.

    이제 사용자 지정 실행 시작 파일 명령이 메뉴에 있습니다. 사용자 정의 명령이 표시되지 않으면, Name에 설명된 대로 <Target> 요소의 특성 값을 <PythonCommands> 요소에 추가했는지 확인하세요. 또한 이 문서의 뒷부분에 있는 문제 해결 섹션에 나열된 고려 사항을 검토합니다.

  12. 시작 파일 실행 명령을 선택합니다. 콘솔 창이 열리고 Hello 사용자 지정 명령아무 키나 눌러 계속하기 위한 텍스트가 표시됩니다. 출력을 확인하고 콘솔 창을 닫습니다.

    비고

    사용자 지정 명령 스크립트는 Python 프로젝트의 활성화된 환경에서 실행됩니다.

  13. 프로젝트 파일을 사용하여 편집기로 전환합니다. <Target> 요소 정의(8단계에서 추가됨)에서 특성 값을 ExecuteIn 변경합니다output.

      <CreatePythonCommandItem
        ...
        ExecuteIn="output">
        ...
      </CreatePythonCommandItem>
    
  14. 변경 내용을 저장하고, Visual Studio로 다시 전환하고, 프로젝트를 다시 로드합니다.

  15. Python 상황에 맞는 메뉴에서 시작 파일 사용자 지정 명령을 다시 선택합니다. 이제 프로그램 출력이 콘솔 창이 아닌 Visual Studio 출력 창에 표시됩니다.

  16. 사용자 지정 명령을 더 추가하려면 다음 동일한 프로세스를 수행합니다.

    1. 프로젝트 파일에서 사용자 지정 명령에 적합한 <Target> 요소를 정의합니다.

    2. Name 속성 그룹에 요소 <Target><PythonCommands> 특성 값을 추가합니다.

    3. 프로젝트 파일에 변경 내용을 저장합니다.

    4. Visual Studio에서 프로젝트를 다시 로드합니다.

프로젝트 속성 사용

요소 특성 값에서 <Target> 프로젝트 속성 또는 환경 변수를 참조하려면 토큰 내 $() 의 속성 이름(예: $(StartupFile)$(MSBuildProjectDirectory))을 사용합니다. 자세한 내용은 msBuild 속성 참조하세요.

($StartupFile) 속성과 같은 프로젝트 속성을 사용하는 명령을 호출하면 토큰이 정의되지 않아 명령이 실패하면 프로젝트를 다시 로드할 때까지 Visual Studio에서 명령을 사용하지 않도록 설정합니다. 속성 정의를 수정하는 프로젝트를 변경하는 경우 변경 내용이 관련 명령의 상태를 새로 고치지 않습니다. 이 경우 프로젝트를 다시 로드해야 합니다.

대상< 요소 구조 이해 >

요소를 사용하여 사용자 지정 명령에 대한 세부 정보를 정의합니다 <Target> . 일반적인 <Target> 요소 형식은 다음의 의사 코드에 표시됩니다.

<Target 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 Yes Visual Studio 프로젝트 내의 명령에 대한 식별자입니다. <PythonCommands> 상황에 맞는 메뉴에 표시되려면 이 이름을 속성 그룹에 추가 해야 합니다.
Label Yes Python 상황에 맞는 메뉴에 표시되는 UI 표시 이름 입니다 .
Returns Yes 반환된 정보에는 대상을 명령으로 식별하는 토큰인 @(Commands)가 반드시 포함되어야 합니다.

CreatePythonCommandItem 특성

<Target> 요소에는 <CreatePythonCommandItem> 사용자 지정 명령에 대한 자세한 동작을 정의하는 요소가 포함됩니다<Output>. 다음 표에서는 사용 가능한 <CreatePythonCommandItem> 요소 특성을 나열합니다. 모든 특성 값은 대/소문자를 구분하지 않습니다.

Attribute 필수 Description
TargetType Yes Target 속성에 포함된 항목과 값이 Arguments 속성과 어떻게 사용되는지를 지정합니다.
- executable: 명령줄에 직접 입력한 것처럼, Target 특성으로 명명된 실행 파일을 실행하고 Arguments 특성의 값을 추가합니다. 값은 인수가 없는 프로그램 이름만 포함해야 합니다.
- script: python.exe 속성의 파일명을 사용하여 Target 명령어를 실행하고, 이어서 Arguments 속성의 값을 사용합니다.
- module: python -m 명령어를 실행하고, Target 속성의 모듈 이름을 지정하고, Arguments 속성의 값을 입력합니다.
- code: 특성에 포함된 Target 인라인 코드를 실행합니다. Arguments 특성 값을 무시합니다.
- pip: Target 속성의 명령을 사용하여 pip를 실행하고, Arguments 속성의 값으로 이어서 실행합니다. 특성이 ExecuteIn로 설정되어 있으면, pip는 output 명령을 실행하라는 요청으로 간주하고, install 특성을 패키지 이름으로 사용한다고 가정합니다.
Target Yes 특성 값 TargetType 에 따라 사용할 파일 이름, 모듈 이름, 코드 또는 pip 명령을 지정합니다.
Arguments 선택적 Target 속성에 사용할 인수 문자열(있는 경우)을 제공합니다.
TargetType 특성 값이 script일 때, Arguments 명령이 아닌 Python 프로그램에 python.exe 값을 제공합니다.
TargetType 속성 값이 code일 때, Arguments 값은 무시됩니다.
ExecuteIn Yes 명령을 실행할 환경을 지정합니다.
- console: (기본값) 명령줄에 직접 입력된 것처럼 Target 특성과 Arguments 값을 사용하여 실행합니다. 특성이 Target 실행되는 동안 명령 창이 나타나고 자동으로 닫힙니다.
- consolepause: 와 같은 console동작이지만 창을 닫기 전에 키 누름을 기다립니다.
- output: 특성을 실행하고 Target Visual Studio 출력 창에 결과를 표시합니다. 특성이 TargetTypepip인 경우 Visual Studio는 Target 특성을 패키지 이름으로 사용하고 Arguments 특성 값을 추가하여 사용합니다.
- repl: Target 속성을 Python 대화형 창에서 실행합니다. 선택적 표시 이름은 창의 제목에 사용됩니다.
- none: .와 동일한 동작입니다 console.
WorkingDirectory 선택적 명령을 실행할 폴더를 식별합니다.
ErrorRegex
WarningRegEx
선택적 ExecuteIn 속성이 output으로 설정된 경우에만 사용됩니다. 두 특성 값 모두 Visual Studio에서 명령 출력을 구문 분석하고 오류 목록 창에 오류 및 경고를 표시하는 데 사용하는 정규식을 지정합니다. 이러한 특성을 지정하지 않으면 명령이 오류 목록 창에 영향을 주지 않습니다. Visual Studio에서 기대하는 항목에 대한 자세한 내용은 명명된 캡처 그룹을 참조하세요.
RequiredPackages 선택적 requirements.txt파일( pip.readthedocs.io )과 동일한 형식을 사용하여 명령에 대한 패키지 요구 사항 목록을 제공합니다. 예를 들어 PyLint 실행 명령은 형식 pylint>=1.0.0을 지정합니다. 명령을 실행하기 전에 Visual Studio는 목록의 모든 패키지가 설치되어 있는지 확인합니다. Visual Studio는 pip를 사용하여 누락된 패키지를 설치합니다.
Environment 선택적 명령을 실행하기 전에 정의할 환경 변수의 문자열을 식별합니다. 각 변수는 세미콜론으로 구분된 여러 변수가 있는 양식을 \<NAME>=\<VALUE> 사용합니다. 값이 여러 개 있는 변수는 다음과 같이 작은따옴표 또는 큰따옴표로 'NAME=VALUE1;VALUE2'포함되어야 합니다.

정규 표현식의 명명된 캡처 그룹

Visual Studio는 사용자 지정 명령 출력에서 오류 및 경고를 구문 분석할 때, ErrorRegexWarningRegex 특성 값의 정규식이 다음과 같은 명명된 그룹을 사용할 것으로 예상합니다.

  • (?<message>...): 오류의 텍스트입니다.
  • (?<code>...): 오류 코드 값입니다.
  • (?<filename>...): 오류가 보고되는 파일의 이름입니다.
  • (?<line>...): 오류가 보고되는 파일의 위치 줄 번호입니다.
  • (?<column>...): 오류가 보고되는 파일의 위치 열 번호입니다.

예를 들어 PyLint는 다음 형식의 경고를 생성합니다.

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

Visual Studio가 이러한 경고에서 올바른 정보를 추출하고 오류 목록WarningRegex 에 표시할 수 있도록 하려면 Pylint 실행 명령의 특성 값은 다음과 같습니다.

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

비고

msg_id 구문은 WarningRegex 속성 값에서 실제로 code이어야 하며, 이는 문제 3680에서 설명되었습니다.

대상 파일을 사용하여 사용자 지정 명령 가져오기

Python 프로젝트 파일에서 사용자 지정 명령을 정의하는 경우 해당 특정 프로젝트에서만 명령을 사용할 수 있습니다. 사용자 지정 명령을 만들고 여러 프로젝트에서 사용하려는 경우 대상 파일(<PythonCommands>)의 모든 <Target> 요소를 사용하여 속성 그룹을 정의 한 다음 해당 파일을 Python 프로젝트로 가져올 수 있습니다.

  • 대상 파일은 동일한 형식과 구문을 사용하여 Python 프로젝트 파일(.pyproj)에 대해 설명한 대로 사용자 지정 명령을 정의합니다. 구성할 공통 요소는 다음과 <PythonCommands><Target><CreatePythonCommandItem>같습니다.<Output>

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
       <PropertyGroup>
         <PythonCommands>
           $(PythonCommands);
           <!-- Additional command names -->
         </PythonCommands>
       </PropertyGroup>
    
       <Target Name="..." Label="..." Returns="@(Commands)">
         <!-- CreatePythonCommandItem and Output elements... -->
       </Target>
    
       <!-- Any number of additional Target elements-->
    </Project>
    
  • 대상 파일을 프로젝트로 가져오려면 프로젝트 파일의 <Import Project="(path)"> 요소 내 아무 곳에 <Project> 요소를 추가합니다.

    예를 들어 Python 프로젝트 내의 targets 폴더에 CustomCommands.targets라는 프로젝트 파일이 있는 경우 프로젝트 파일에 다음 코드를 추가합니다.

    <Import Project="targets/CustomCommands.targets"/>
    
  • 프로젝트 파일이 대상 파일을 가져오고 프로젝트가 Visual Studio에서 열려 있는 동안 대상 파일을 변경하는 경우 프로젝트뿐만 아니라 프로젝트가 포함된 Visual Studio 솔루션을다시 빌드해야 합니다.

예제 명령

다음 섹션에서는 Python 프로젝트에 대한 사용자 지정 명령을 정의하는 데 사용할 수 있는 예제 코드를 제공합니다.

PyLint 실행(모듈 대상)

다음 코드는 Microsoft.PythonTools.targets 파일에 나타납니다.

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

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

특정 패키지(pip 대상)를 사용하여 pip 설치 실행

다음 명령은 Visual Studio pip install my-package 창에서 명령을 실행 합니다. 패키지를 개발하고 설치를 테스트할 때 이와 같은 명령을 사용할 수 있습니다. <Target> 요소에는 install 명령이 아닌 패키지 이름이 포함되며, 이는 ExecuteIn="output" 특성 정의를 사용할 때 가정됩니다.

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

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

오래된 pip 패키지 표시(pip 타겟)

다음 명령을 실행하면 list 함수를 사용해 pip의 최신 버전이 아닌 패키지를 식별합니다.

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

서버 실행 및 디버그 서버 명령 실행

웹 프로젝트에 대한 시작 서버디버그 시작 서버 명령이 정의되는 방법을 살펴보려면 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>

(GitHub)의 fxthomas/Example.pyproj.xml에서 가져옴, 사용 허가를 받음.

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>

(GitHub)의 fxthomas/Example.pyproj.xml에서 가져옴, 사용 허가를 받음.

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>

(GitHub)의 fxthomas/Example.pyproj.xml에서 가져옴, 사용 허가를 받음.

사용자 지정 명령 문제 해결

사용자 지정 명령 작업과 관련된 가능한 문제는 다음 섹션을 검토하세요.

프로젝트 파일이 로드되지 않음

이 오류 메시지는 프로젝트 파일에 구문 오류가 있음을 나타냅니다. 메시지에는 줄 번호와 문자 위치가 있는 특정 오류가 포함됩니다.

명령 실행 후 콘솔 창이 닫힙니다.

명령을 실행한 직후 콘솔 창이 닫히면 대신 특성 정의를 ExecuteIn="consolepause"사용합니다ExecuteIn="console".

메뉴에서 누락된 명령

Python 상황에 맞는 메뉴에 사용자 지정 명령이 표시되지 않으면 다음 항목을 확인합니다.

  • 명령이 속성 그룹에 포함되어 <PythonCommands> 있는지 확인합니다.
  • 정의된 명령 이름이 요소에 지정된 <Target> 이름과 일치하는지 확인합니다.

다음은 예제입니다. 다음 XML 코드 조각에서, Example 속성 그룹의 <PythonCommands> 이름이 요소 정의의 ExampleCommand 이름과 <Target> 일치하지 않습니다. Visual Studio에서 이름이 지정된 Example명령을 찾을 수 없으므로 명령이 표시되지 않습니다. 명령 목록에서 ExampleCommand를 사용하거나 대상 이름을 Example만으로 변경합니다.

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

명령을 실행하는 동안 오류가 발생했습니다. 명령 대상을 얻지 못했습니다.

이 오류 메시지는 <Target> 또는 <CreatePythonCommandItem> 요소의 내용이 잘못되었음을 나타냅니다.

이 오류의 몇 가지 가능한 이유는 다음과 같습니다.

  • 필수 <Target> 요소 특성이 비어 있습니다.
  • 필수 TargetType 특성이 비어 있거나 인식할 수 없는 값이 포함되어 있습니다.
  • 필수 ExecuteIn 특성이 비어 있거나 인식할 수 없는 값이 포함되어 있습니다.
  • ErrorRegex 또는 WarningRegex 특성은 특성 정의를 설정 ExecuteIn="output" 하지 않고 지정됩니다.
  • 인식할 수 없는 특성이 요소에 있습니다. 예를 들어, 속성 참조가 Argumnets이 아닌 Arguments으로 잘못 철자될 수 있습니다.

정의되지 않은 속성을 참조하는 경우 특성 값은 비어 있을 수 있습니다. 토큰 $(StartupFile) 을 사용하지만 프로젝트에 시작 파일이 정의되지 않은 경우 토큰은 빈 문자열로 확인됩니다. 이러한 경우 기본값을 정의할 수 있습니다. 예를 들어 Bottle, Flask 및 Django 프로젝트 템플릿에 정의된 서버 실행디버그 서버 실행 명령은 기본적으로 manage.py 파일을 사용합니다(서버 시작 파일이 프로젝트 속성에 지정되지 않은 경우).

Visual Studio에서 응답이 중단되거나 프로그램이 충돌함

사용자 지정 명령을 실행할 때 Visual Studio가 응답을 중지하고 충돌하는 경우 특성 정의를 사용하여 콘솔 명령을 ExecuteIn="output" 실행하려고 할 수 있습니다. 이러한 경우 Visual Studio는 출력을 구문 분석하려고 할 때 충돌할 수 있습니다. 이 조건을 방지하려면 특성 정의를 대신 사용합니다 ExecuteIn="console" . 자세한 내용은 문제 3681을 참조하세요.

명령이 작동 가능한 프로그램 또는 일괄 처리 파일로 인식되지 않음

특성 정의를 로 설정할 때, 특성 값 에는 인수가 없는 프로그램 이름 포함되어야 합니다(예: 또는 만). 이 경우 인수를 Arguments 특성으로 이동합니다.