다음을 통해 공유


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

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

필수 조건

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 프로젝트를 다시 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.

    Visual Studio에서 언로드된 프로젝트 파일을 편집하여 사용자 지정 명령을 추가하는 방법을 보여 주는 스크린샷.

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

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

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

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

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

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

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

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

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

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

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

  4. Visual Studio 세션 외부에서 별도의 편집기를 시작하고 편집기에서 Python 프로젝트 파일(Python-CustomCommands.pyproj)을 엽니다. (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로 치환합니다. 이 구문은 Python 컨텍스트 메뉴에 사용자 지정 명령을 추가하는 <Target> 요소의 Name 특성을 정의합니다. 명령에는 시작 파일 실행 메뉴 레이블이 있습니다.

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

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

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

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

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

    Visual Studio 2022의 Python 컨텍스트 메뉴에서 시작 파일 사용자 지정 명령을 실행하는 스크린샷.

    Visual Studio의 Python 컨텍스트 메뉴에서 시작 파일 사용자 지정 명령을 실행하는 스크린샷.

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

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

    참고 항목

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

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

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

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

    Visual Studio 2022 출력 창의 사용자 지정 명령 출력을 보여 주는 스크린샷.

    Visual Studio 출력 창의 사용자 지정 명령 출력을 보여 주는 스크린샷.

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

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

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

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

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

프로젝트 속성 사용

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

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

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

CreatePythonCommandItem 특성

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

Attribute Required 설명
TargetType Target 특성에 포함된 내용과 값이 Arguments 특성과 함께 사용되는 방법을 지정합니다.
- executable: Target 특성에 이름이 지정된 실행 파일을 실행하여 Arguments 특성의 값을 마치 명령줄에서 직접 입력한 것처럼 추가합니다. 값은 인수 없이 프로그램 이름만 포함해야 합니다.
- script: Target 특성에 파일 이름을 입력하고 그 뒤에 Arguments 특성 값을 입력하여 python.exe 명령을 실행합니다.
- module: Target 특성의 모듈 이름, Arguments 특성의 값 순으로 python -m 명령을 실행합니다.
- code: Target 특성에 포함된 인라인 코드를 실행합니다. Arguments 특성 값을 무시합니다.
- pip: Target 특성의 명령을 입력하고 Arguments 특성의 값을 입력하여 pip를 실행합니다. ExecuteIn 특성이 output으로 설정된 경우 pip는 요청이 install 명령을 실행하고 Target 특성을 패키지 이름으로 사용한다고 가정합니다.
Target TargetType 특성 값에 따라 사용할 파일 이름, 모듈 이름, 코드 또는 pip 명령을 지정합니다.
Arguments 선택 사항 Target 특성에 사용할 인수의 스트링(있는 경우)을 제공합니다.
- TargetType 특성 값이 script인 경우 python.exe 명령이 아닌 Python 프로그램에 Arguments 값이 제공됩니다.
- 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가 사용자 지정 명령 출력에서 ​​오류와 경고를 구문 분석할 때 ErrorRegexWarningRegex 특성 값의 정규식은 다음과 같이 명명된 그룹을 사용할 것으로 예상합니다.

  • (?<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>.+?)$]]

참고 항목

issue 3680에 설명된 대로 WarningRegex 특성 값의 msg_id 구문은 실제로 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 프로젝트 내의 대상 폴더에 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>

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

웹 프로젝트에 대한 Start serverStart debug server 명령이 정의되는 방법을 알아보려면 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 Installer 생성

다음 스크립트는 Windows Installer를 생성합니다.

<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" 특성 정의를 대신 사용합니다. 자세한 정보는 issue 3681을 참조하세요.

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

TargetType="executable" 특성 정의를 설정할 때 Target 특성의 값은 오직 인수가 없는 프로그램 이름이어야 합니다(예: 오직 python 또는 python.exe). 이 경우 인수를 모두 Arguments 특성으로 이동합니다.