VS Code에서 Python 디버깅
Python 확장은 여러 유형의 Python 애플리케이션을 위한 Python Debugger 확장을 통해 디버깅을 지원합니다. 기본 디버깅에 대한 간단한 안내는 튜토리얼 - 디버거 구성 및 실행을 참조하세요. 또한 Flask 튜토리얼도 확인하세요. 두 튜토리얼 모두 중단점 설정 및 코드 단계 실행과 같은 핵심 기술을 보여줍니다.
변수 검사, 중단점 설정 및 언어에 의존하지 않는 기타 활동과 같은 일반적인 디버깅 기능에 대해서는 VS Code 디버깅을 검토하세요.
이 문서에서는 특정 앱 유형 및 원격 디버깅을 위한 필수 단계를 포함하여 Python 전용 디버깅 _구성_에 주로 다룹니다.
Python Debugger 확장
Python Debugger 확장은 VS Code의 Python 확장과 함께 자동으로 설치됩니다. 이 확장은 스크립트, 웹 앱, 원격 프로세스 등 여러 유형의 Python 애플리케이션을 위한 debugpy와 함께 디버깅 기능을 제공합니다.
설치 여부를 확인하려면 확장 뷰(kb(workbench.view.extensions)
)를 열고 @installed python debugger
를 검색하세요. 결과에서 Python Debugger 확장이 나열되어야 합니다.
지원되는 Python 버전에 대한 정보는 확장의 README 페이지를 참조하세요.
구성 초기화
구성은 디버깅 세션 중 VS Code의 동작을 제어합니다. 구성은 작업 공간의 .vscode
폴더에 저장된 launch.json
파일에 정의됩니다.
참고: 디버깅 구성을 변경하려면 코드가 폴더에 저장되어 있어야 합니다.
디버그 구성을 초기화하려면 먼저 사이드바에서 실행 뷰를 선택하세요:
아직 정의된 구성이 없다면 실행 및 디버그 버튼과 구성(launch.json) 파일을 생성하는 링크가 표시됩니다:
Python 구성이 포함된 launch.json
파일을 생성하려면 다음 단계를 따르세요:
-
launch.json 파일 생성 링크(위 이미지에서 강조 표시됨)를 선택하거나 실행 > 구성 열기 메뉴 명령을 사용하세요.
-
디버거 옵션 목록에서 Python Debugger를 선택하세요.
-
Command Palette에서 구성 메뉴가 열리며 Python 프로젝트 파일에 사용할 디버그 구성 유형을 선택할 수 있습니다. 단일 Python 스크립트를 디버깅하려면 나타나는 디버그 구성 선택 메뉴에서 Python 파일을 선택하세요.
참고: 구성 없이 디버그 패널,
kbstyle(F5)
, 또는 실행 > 디버깅 시작을 통해 디버깅 세션을 시작하면 디버그 구성 메뉴가 나타나지만launch.json
파일은 생성되지 않습니다. -
그런 다음 Python Debugger 확장은 이전에 선택한 내용을 기반으로 미리 정의된 구성이 포함된
launch.json
파일을 생성하고 엽니다. 이 경우 Python 파일입니다. 구성을 수정할 수 있으며(예: 인수를 추가) 사용자 정의 구성을 추가할 수도 있습니다.
구성 속성의 세부 사항은 이 문서의 표준 구성 및 옵션 섹션에서 다룹니다. 다른 구성은 특정 앱 유형 디버깅 섹션에서도 설명됩니다.
추가 구성
기본적으로 VS Code는 Python Debugger 확장에서 제공하는 가장 일반적인 구성만 표시합니다. 구성 추가 명령을 사용하여 launch.json
에 포함할 다른 구성을 선택할 수 있습니다. 명령을 사용하면 VS Code가 사용 가능한 모든 구성 목록을 표시합니다(반드시 Python 옵션을 선택하세요):
프로세스 ID 사용하여 연결을 선택하면 다음과 같은 결과가 나타납니다:
이러한 모든 구성에 대한 세부정보는 특정 앱 유형 디버깅에서 확인하세요.
디버깅 중 상태 표시줄에는 현재 구성과 현재 디버깅 인터프리터가 표시됩니다. 구성을 선택하면 다른 구성을 선택할 수 있는 목록이 나타납니다:
기본적으로 디버거는 VS Code의 Python 확장에서 선택한 것과 동일한 인터프리터를 사용합니다. 디버깅을 위해 다른 인터프리터를 사용하려면 해당 디버거 구성의 launch.json
에서 python
의 값을 설정하세요. 또는 상태 표시줄의 Python 인터프리터 표시기를 사용하여 다른 인터프리터를 선택할 수 있습니다.
기본 디버깅
Python 스크립트를 디버깅하는 데만 관심이 있다면 가장 간단한 방법은 편집기에서 실행 버튼 옆의 아래 화살표를 선택하고 Python Debugger: Python 파일 디버그를 선택하는 것입니다.
Flask, Django 또는 FastAPI를 사용하여 웹 애플리케이션을 디버깅하려는 경우, Python Debugger 확장은 모든 자동 디버그 구성 표시 옵션 아래에서 프로젝트 구조에 따라 동적으로 생성된 디버그 구성을 제공합니다. 이는 실행 및 디버그 뷰를 통해 가능합니다.
다른 종류의 애플리케이션을 디버깅하려는 경우 실행 뷰에서 실행 및 디버그 버튼을 클릭하여 디버거를 시작할 수 있습니다.
구성이 설정되지 않은 경우 디버깅 옵션 목록이 표시됩니다. 여기에서 적절한 옵션을 선택하여 코드를 빠르게 디버깅할 수 있습니다.
두 가지 일반적인 옵션은 현재 열려 있는 Python 파일을 실행하기 위해 Python 파일 구성을 사용하거나 이미 실행 중인 프로세스에 디버거를 연결하기 위해 프로세스 ID 사용하여 연결 구성을 사용하는 것입니다.
디버깅 구성 생성 및 사용에 대한 정보는 구성 초기화 및 추가 구성 섹션을 참조하세요. 구성이 추가되면 드롭다운 목록에서 선택할 수 있으며 디버깅 시작 버튼(kbstyle(F5)
)을 사용하여 시작할 수 있습니다.
명령줄 디버깅
디버거는 Python 환경에 debugpy
가 설치되어 있는 경우 명령줄에서도 실행할 수 있습니다.
debugpy 설치
Python 환 경에 python -m pip install --upgrade debugpy
를 사용하여 debugpy를 설치할 수 있습니다.
팁: 가상 환경을 사용하는 것은 필수가 아니지만 권장되는 모범 사례입니다. VS Code에서 Command Palette(
kb(workbench.action.showCommands)
)를 열고 Python: 가상 환경 만들기 명령(kb(workbench.action.terminal.newWithProfilePython)
)을 실행하여 가상 환경을 만들 수 있습니다.
명령줄 구문
디버거 명령줄 구문은 다음과 같습니다:
python -m debugpy
--listen | --connect
[<host>:]<port>
[--wait-for-client]
[--configure-<name> <value>]...
[--log-to <path>] [--log-to-stderr]
<filename> | -m <module> | -c <code> | --pid <pid>
[<arg>]...
예시
명령줄에서 지정된 포트(5678)와 스크립트를 사용하여 디버거를 시작할 수 있습니다. 이 예시는 스크립트가 장기 실행되며 --wait-for-client
플래그를 생략하므로 클라이언트가 연결될 때까지 기다리지 않습니다.
python -m debugpy --listen 5678 ./myscript.py
그런 다음 VS Code Python Debugger 확장에서 연결하기 위해 다음 구성을 사용할 수 있습니다.
{
"name": "Python Debugger: Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
}
}
참고: listen에 대한 호스트 지정은 선택 사항이며 기본적으로 127.0.0.1이 사용됩니다.
원격 코드 또는 Docker 컨테이너에서 실행 중인 코드를 디버깅하려는 경우, 이전 CLI 명령을 수정하여 호스트를 지정해야 합니다.
python -m debugpy --listen 0.0.0.0:5678 ./myscript.py
연관된 구성 파일은 다음과 같이 보일 것입니다.
{
"name": "Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "remote-machine-name", // 원격 머신 이름으로 교체
"port": 5678
}
}
참고:
127.0.0.1
또는localhost
이외의 호스트 값을 지정하면 모든 머신에서 접근할 수 있도록 포트를 열게 되므로 보안 위험이 따릅니다. 원격 디버깅을 수행할 때 SSH 터널을 사용하는 등 적절한 보안 조치를 취하고 있는지 확인해야 합니다.
명령줄 옵션
플래그 | 옵션 | 설명 |
---|---|---|
--listen 또는 --connect | [<host>:]<port> | 필수. 디버그 어댑터 서버가 수신 연결을 기다리거나(--listen) 클라이언트와 연결하기 위해 사용되는 호스트 주소와 포트를 지정합니다(--connect). 이는 VS Code 디버그 구성에서 사용되는 동일한 주소입니다. 기본적으로 호스트 주소는 localhost (127.0.0.1) 입니다. |
--wait-for-client | 없음 | 선택 사항. 디버그 서버에서 연결이 있을 때까지 코드를 실행하지 않도록 지정합니다. 이 설정을 통해 코드의 첫 번째 줄에서 디버깅할 수 있습니다. |
--log-to | <path> | 선택 사항. 로그를 저장할 기존 디렉토리의 경로를 지정합니다. |
--log-to-stderr | 없음 | 선택 사항. debugpy가 stderr에 직접 로그를 작성하도록 활성화합니다. |
--pid | <pid> | 선택 사항. 이미 실행 중인 프로세스를 지정하여 디버그 서버를 주입합니다. |
--configure-<name> | <value> | 선택 사항. 클라이언트가 연결되기 전에 디버그 서버에서 알아야 하는 디버그 속성을 설정합니다. 이러한 속성은 launch 구성에서 직접 사용할 수 있지만 attach 구성에서는 이 방식으로 설정해야 합니다. 예를 들어, 디버그 서버가 연결 중인 프로세스에서 생성된 하위 프로세스에 자동으로 주입되지 않도록 하려면 --configure-subProcess false 를 사용하세요. |
참고:
[<arg>]
는 시작되는 앱에 명령줄 인수를 전달하는 데 사용할 수 있습니다.
네트워크 연결을 통한 연결 디버깅
로컬 스크립트 디버깅
다른 프로세스에 의해 로컬에서 호출된 Python 스크립트를 디버깅해야 하는 경우가 있을 수 있습니다. 예를 들어, 특정 처리 작업을 위해 다양한 Python 스크립트를 실행하는 웹 서버를 디버깅하는 경우가 있습니다. 이러한 경우 스크립트가 실행된 후 VS Code 디버거를 스크립트에 연결해야 합니다:
-
VS Code를 실행하고 스크립트가 포함된 폴더 또는 작업 공간을 열고, 해당 작업 공간에 대해
launch.json
을 생성합니다(아직 없는 경우). -
스크립트 코드에 다음을 추가하고 파일을 저장하세요:
import debugpy
# 5678은 VS Code 디버그 구성의 기본 연결 포트입니다. 호스트와 포트를 지정하지 않으면 호스트는 기본적으로 127.0.0.1입니다.
debugpy.listen(5678)
print("디버거 연결 대기 중")
debugpy.wait_for_client()
debugpy.breakpoint()
print('이 줄에서 중단') -
터미널: 새 터미널 만들기를 사용하여 터미널을 열고, 스크립트의 선택된 환경을 활성화합니다.
-
터미널에서 debugpy 패키지 설치를 수행합니다.
-
터미널에서 스크립트와 함께 Python을 시작합니다. 예를 들어,
python3 myscript.py
를 실행합니다. 코드에 포함된 "디버거 연결 대기 중" 메시지가 표시되고, 스크립트는debugpy.wait_for_client()
호출에서 중단됩니다. -
실행 및 디버그 뷰(
kb(workbench.view.debug)
)로 전환하고, 디버거 드롭다운 목록에서 적절한 구성을 선택한 후 디버거를 시작합니다. -
디버거는
debugpy.breakpoint()
호출에서 중단되며, 그 시점부터는 디버거를 정상적으로 사용할 수 있습니다. 또한 UI를 사용하여 스크립트 코드에서 다른 중단점을 설정할 수도 있습니다.
SSH를 통한 원격 스크립트 디버깅
원격 디버깅을 통해 원격 컴퓨터에서 실행되는 프로그램을 VS Code 내에서 로컬로 단계별로 실행할 수 있습니다. 원격 컴퓨터에 VS Code를 설치할 필요는 없습니다. 보안을 강화하기 위해 디버깅할 때 원격 컴퓨터에 대한 안전한 연결(예: SSH)을 사용해야 할 수 있습니다.
참고: Windows 컴퓨터에서는
ssh
명령을 사용하기 위해 Windows 10 OpenSSH를 설치해야 할 수 있습니다.
다음 단계는 SSH 터널을 설정하는 일반적인 프로세스를 설명합니다. SSH 터널을 사용하면 공용 액세스를 위해 포트를 열어두는 것보다 더 안전한 방식으로 로컬 머신에서 작업하는 것처럼 원격 머신에서 작업할 수 있습니다.
원격 컴퓨터에서:
-
/etc/ssh/
아래에 있는sshd_config
구성 파일을 열고 다음 설정을 추가하거나 수정하여 포트 포워딩을 활성화합니다:AllowTcpForwarding yes
참고: AllowTcpForwarding의 기본값은 yes이므로 변경할 필요가 없을 수 있습니다.
-
AllowTcpForwarding
을 추가하거나 수정해야 했다면 SSH 서버를 재시작합니다. Linux/macOS에서는sudo service ssh restart
를 실행하고, Windows에서는services.msc
를 실행하여 서비스 목록에서 OpenSSH 또는sshd
를 선택한 후 재시작을 선택합니다.
로컬 컴퓨터에서:
-
ssh -2 -L sourceport:localhost:destinationport -i identityfile user@remoteaddress
를 실행하여 SSH 터널을 생성합니다.destinationport
에 대해 선택한 포트와 적절한 사용자 이름 및 원격 컴퓨터의 IP 주소를 사용합니다. 예를 들어, IP 주소 1.2.3.4에서 포트 5678을 사용하려면 명령은ssh -2 -L 5678:localhost:5678 -i identityfile [email protected]
가 됩니다.-i
플래그를 사용하여 신원 파일의 경로를 지정할 수 있습니다. -
SSH 세션에서 프롬프트를 볼 수 있는지 확인합니다.
-
VS Code 작업 공간에서
launch.json
파일에 원격 디버깅을 위한 구성을 생성하고, 포트를 SSH 명령에서 사용한 포트와 일치하도록 설정하며, 호스트를localhost
로 설정합니다. SSH 터널을 설정했기 때문에 여기서localhost
를 사용합니다.{
"name": "Python Debugger: Attach",
"type": "debugpy",
"request": "attach",
"port": 5678,
"host": "localhost",
"pathMappings": [
{
"localRoot": "$\{workspaceFolder\}
", // C:\Users\user1\project1에 매핑
"remoteRoot": "." // 현재 작업 디렉토리 ~/project1에 매핑
}
]
}
디버깅 시작하기
이제 원격 컴퓨터에 대한 SSH 터널이 설정되었으므로 디버깅을 시작할 수 있습니다.
-
두 컴퓨터 모두: 동일한 소스 코드가 사용 가능해야 합니다.
-
두 컴퓨터 모두: debugpy 설치를 수행합니다.
-
원격 컴퓨터: 원격 프로세스에 연결하는 방법을 두 가지로 지정할 수 있습니다.
-
소스 코드에 다음 줄을 추가하고,
address
를 원격 컴퓨터의 IP 주소와 포트 번호로 교체합니다(여기서는 IP 주소 1.2.3.4가 예시로 사용됩니다).import debugpy
# 다른 컴퓨터가 이 IP 주소와 포트에서 debugpy에 연결할 수 있도록 허용합니다.
debugpy.listen(('1.2.3.4', 5678))
# 원격 디버거가 연결될 때까지 프로그램을 일시 중지합니다.
debugpy.wait_for_client()listen
에서 사용된 IP 주소는 원격 컴퓨터의 개인 IP 주소여야 합니다. 그런 다음 프로그램을 정상적으로 실행하면 디버거가 연결될 때까지 일시 중지됩니다. -
debugpy를 통해 원격 프로세스를 시작합니다. 예를 들어:
python3 -m debugpy --listen 1.2.3.4:5678 --wait-for-client -m myproject
이는
python3
를 사용하여 패키지myproject
를 시작하며, 원격 컴퓨터의 개인 IP 주소인1.2.3.4
에서 포트5678
을 수신 대기합니다(파일 경로를 지정하여 원격 Python 프로세스를 시작할 수도 있습니다. 예:./hello.py
).
-
-
로컬 컴퓨터: 원격 컴퓨터에서 위에 설명한 대로 소스 코드를 수정한 경우에만, 소스 코드에 원격 컴퓨터에서 추가한 동일한 코드의 주석 처리된 복사본을 추가합니다. 이러한 줄을 추가하면 두 컴퓨터의 소스 코드가 줄 단위로 일치하는지 확인할 수 있습니다.
#import debugpy
# 다른 컴퓨터가 이 IP 주소와 포트에서 debugpy에 연결할 수 있도록 허용합니다.
#debugpy.listen(('1.2.3.4', 5678))
# 원격 디버거가 연결될 때까지 프로그램을 일시 중지합니다.
#debugpy.wait_for_client() -
로컬 컴퓨터: VS Code에서 실행 및 디버그 뷰(
kb(workbench.view.debug)
)로 전환하고, Python Debugger: Attach 구성을 선택합니다. -
로컬 컴퓨터: 디버깅을 시작할 위치에 중단점을 설정합니다.
-
로컬 컴퓨터: 수정된 Python Debugger: Attach 구성을 사용하여 VS Code 디버거를 시작하고 디버깅 시작 버튼을 클릭합니다. VS Code는 로컬에서 설정한 중단점에서 중단되며, 코드를 단계별로 실행하고 변수를 검사하고 모든 디버깅 작업을 수행할 수 있습니다. 디버그 콘솔에 입력한 표현식은 원격 컴퓨터에서도 실행됩니다.
print
문과 같은 stdout에 대한 텍스트 출력은 두 컴퓨터 모두에 표시됩니다. 그러나 matplotlib과 같은 패키지에서 생성된 그래픽 플롯과 같은 다른 출력은 원격 컴퓨터에만 표시됩니다. -
원격 디버깅 중 디버깅 도구 모음은 아래와 같이 표시됩니다: