다음을 통해 공유


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

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

필수 구성 요소

  • Python 워크로드를 지원하여 설치된 Windows의 Visual Studio. Visual Studio에서 Python 지원을 설치하려면 을(를) 참조하세요.

Mac용 Visual Studio는 지원되지 않습니다. 자세한 내용은 Mac용 Visual Studio의 변화에 관한 내용을 참조하세요. Windows, Mac 및 Linux에서 Visual Studio Code는 사용 가능한 확장을 통해 Python과 잘 작동합니다.

사용자 지정 명령 살펴보기

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

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

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

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

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

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

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

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

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

    Visual Studio 2022의 Python 프로젝트 메뉴에 Django 프로젝트에 대해 추가된 사용자 지정 명령을 보여 주는 스크린샷

    Visual Studio의 Python 프로젝트 메뉴에 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 도구 모음에서옵션을 디버깅하지 않고 디버그> Start를 사용하는 것과 기본적으로 동일한 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 실행 명령만 표시됩니다. 프로젝트 파일에 방금 추가한 코드는 PyLint 명령을 포함하는 기본 <PythonCommands> 속성 그룹을 복제하기만 하면 됩니다. 다음 단계에서는 사용자 지정 명령에 대한 코드를 더 추가합니다.

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

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

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

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

    사용자 지정 명령이 $(PythonCommands) 토큰에 정의된 기본 명령 앞에 상황에 맞는 메뉴에 표시되도록 하려면 해당 토큰 앞에 명령에 대한 <Target> 구문을 배치합니다.

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

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

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

  12. 시작 파일 실행 명령을 선택합니다. 콘솔 창이 열리고 텍스트 'Hello 사용자 지정 명령' 이 표시된 후 아무 키나 누르세요계속합니다. 출력을 확인하고 콘솔 창을 닫습니다.

    visual Studio의 콘솔 창에서 사용자 지정 명령 출력을 보여 주는 스크린샷

    메모

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

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

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

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

    visual Studio 2022 출력 창에 표시되는 사용자 지정 명령 출력을 보여 주는 스크린샷

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

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

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

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

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

프로젝트 속성 사용

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

StartupFile 속성과 같은 프로젝트 속성을 사용하는 ($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> 요소 특성을 나열합니다.

속성 필수 묘사
Name Visual Studio 프로젝트 내의 명령에 대한 식별자입니다. 명령이 Python 상황에 맞는 메뉴에 표시되려면 이 이름을 <PythonCommands> 속성 그룹에 추가해야 합니다.
Label Python 상황에 맞는 메뉴에 표시되는 UI 표시 이름입니다.
Returns 반환된 정보이며, 대상을 명령으로 식별하는 @(Commands) 토큰을 포함해야 합니다.

CreatePythonCommandItem 특성

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

Attribute 필수 묘사
TargetType Target 특성에 포함된 항목과 값이 Arguments 특성과 함께 사용되는 방식을 지정합니다.
- executable: 명령줄에 직접 입력한 것처럼 Arguments 특성에 값을 추가하여 Target 특성에 명명된 실행 파일을 실행합니다. 값은 인수가 없는 프로그램 이름만 포함해야 합니다.
- script: Target 특성의 파일 이름과 Arguments 특성의 값으로 python.exe 명령을 실행합니다.
- module: python -m 명령을 실행하고, Target 특성에 모듈 이름을 지정한 다음, Arguments 특성에 값을 지정합니다.
- code: Target 특성에 포함된 인라인 코드를 실행합니다. Arguments 특성 값을 무시합니다.
- pip: Target 속성의 명령을 실행하고, 이어서 Arguments 속성의 값을 사용하여 pip를 실행합니다. ExecuteIn 특성이 output설정된 경우 pip는 요청이 install 명령을 실행하고 Target 특성을 패키지 이름으로 사용한다고 가정합니다.
Target TargetType 특성의 값에 따라 사용할 파일 이름, 모듈 이름, 코드 또는 pip 명령을 지정합니다.
Arguments 선택적 Target 특성에 사용할 인수 문자열(있는 경우)을 제공합니다.
- TargetType 특성 값이 script경우 Arguments 값은 python.exe 명령이 아닌 Python 프로그램에 제공됩니다.
- TargetType 특성 값이 code경우 Arguments 값이 무시됩니다.
ExecuteIn 명령을 실행할 환경을 지정합니다.
- console: (기본값) 명령줄에 직접 입력된 것처럼 Arguments 값을 사용하여 Target 특성을 실행합니다. Target 특성이 실행되는 동안 명령 창이 나타나고 자동으로 닫힙니다.
- consolepause: console동작과 동일하지만 창을 닫기 전에 키 누름을 기다립니다.
- output: Target 특성을 실행하고 Visual Studio 출력 창에 결과를 표시합니다. TargetType 특성이 pip경우 Visual Studio는 Target 특성을 패키지 이름으로 사용하고 Arguments 특성 값을 추가합니다.
- repl: Python 대화형 창Target 특성을 실행합니다. 선택적 표시 이름은 창의 제목에 사용됩니다.
- 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에서 사용자 지정 명령 출력의 오류 및 경고를 구문 분석하는 경우 ErrorRegex 정규식 및 WarningRegex 특성 값에서 다음과 같은 명명된 그룹을 사용해야 합니다.

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

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

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

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

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

메모

WarningRegex 속성 값의 msg_id 구문은 실제로 이슈 3680에 설명된 대로 code이어야 합니다.

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

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

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

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

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

    <Import Project="targets/CustomCommands.targets"/>
    
  • 프로젝트 파일이 대상 파일을 가져오고 프로젝트가 Visual Studio에서 열려 있는 동안 대상 파일을 변경하는 경우 프로젝트뿐만 아니라 프로젝트가 포함된 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> 요소는 ExecuteIn="output" 특성 정의를 사용할 때 가정되는 install 명령이 아닌 패키지 이름을 포함합니다.

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

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

오래된 pip 패키지 표시(pip 대상)

다음 명령은 list 함수를 사용하여 pip를 실행하여 오래된 pip 패키지를 식별합니다.

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

<Target Name="ShowOutdatedPackages" Label="Show outdated pip packages" Returns="@(Commands)">
  <CreatePythonCommandItem Target="list" TargetType="pip" Arguments="-o --format columns"
    WorkingDirectory="$(MSBuildProjectDirectory)" ExecuteIn="consolepause">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

consolepause를 사용하여 실행 파일 실행

다음 명령은 where 함수를 실행하여 프로젝트 폴더에서 시작하는 Python 파일의 위치를 표시합니다.

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

<Target Name="ShowAllPythonFilesInProject" Label="Show Python files in project" Returns="@(Commands)">
  <CreatePythonCommandItem Target="where" TargetType="executable" Arguments="/r . *.py"
    WorkingDirectory="$(MSBuildProjectDirectory)" ExecuteIn="output">
    <Output TaskParameter="Command" ItemName="Commands" />
  </CreatePythonCommandItem>
</Target>

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

웹 프로젝트에 대한 시작 서버디버그 시작 서버 명령이 정의되는 방법을 살펴보려면 GitHub에서 Microsoft.PythonTools.Web.targets 리포지토리를 검사합니다.

개발을 위한 패키지 설치

다음 코드는 pip를 실행하여 패키지를 설치합니다.

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

<Target Name="PipInstallDevCommand" Label="Install package for development" Returns="@(Commands)">
    <CreatePythonCommandItem Target="pip" TargetType="module" Arguments="install --editable $(ProjectDir)"
        WorkingDirectory="$(WorkingDirectory)" ExecuteIn="Repl:Install package for development">
      <Output TaskParameter="Command" ItemName="Commands" />
    </CreatePythonCommandItem>
  </Target>

fxthomas/Example.pyproj.xml (GitHub)에서 사용 허가를 받아 사용함.

Windows 설치 프로그램 생성

다음 스크립트는 Windows 설치 관리자를 생성합니다.

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

<Target Name="BdistWinInstCommand" Label="Generate Windows Installer" Returns="@(Commands)">
    <CreatePythonCommandItem Target="$(ProjectDir)setup.py" TargetType="script"
        Arguments="bdist_wininst --user-access-control=force --title &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

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="console"대신 ExecuteIn="consolepause" 특성 정의를 사용합니다.

메뉴에서 누락된 명령

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

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

다음은 예제입니다. 다음 XML 코드 조각에서 <PythonCommands> 속성 그룹의 Example 이름이 <Target> 요소 정의의 ExampleCommand 이름과 일치하지 않습니다. 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" 특성 정의를 설정하지 않고 지정됩니다.
  • 인식할 수 없는 특성이 요소에 있습니다. 예를 들어 특성 참조의 철자가 Arguments아니라 Argumnets 잘못 입력될 수 있습니다.

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

Visual Studio에서 응답하지 않음 또는 충돌

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

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

TargetType="executable" 속성 정의를 설정할 때, Target 속성의 값은 python 또는 python.exe와 같은 인수 없이 오직 에 프로그램 이름 해야 합니다. 이 경우 인수를 Arguments 특성으로 이동합니다.