Python을 쓰다 보면 pip3 install {패키지명}을 습관처럼 치게 되는데, 이렇게 설치한 패키지는 전부 한곳에 쌓인다. 로컬의 다른 프로젝트가 같은 패키지의 다른 버전을 원하면 서로 부딪히고, 패키지끼리 의존성이 꼬이기도 한다.
Python에 기본으로 들어 있는 venv 모듈은 이 “한곳"을 프로젝트마다 따로 만들어 준다. 작업 환경이 바뀌어도 같은 패키지를 같은 버전으로 다시 깔 수 있다. 이 글에서는 가상환경을 만들고 지우기까지의 명령어와, 놓치기 쉬운 VS Code 인터프리터 설정을 정리한다.
가상환경은 폴더 하나다
먼저 지금 설치된 패키지 목록을 본다.
pip list
가상환경을 만든다.
# venv 모듈을 실행해 myenv라는 가상환경을 만든다
python3 -m venv myenv
-m venv는 venv라는 모듈을 실행하겠다는 뜻이다. myenv는 가상환경 이름이고 마음대로 정해도 된다. 명령이 끝나면 현재 디렉터리에 myenv 폴더가 생기고, 그 안에 Python 실행 파일과 패키지를 담을 site-packages가 따로 들어 있다. 가상환경의 실체는 이 폴더 하나이고, 패키지는 이제 이 안에만 설치된다.
활성화한다.
source myenv/bin/activate
activate는 현재 셸의 PATH 맨 앞에 myenv/bin을 끼워 넣으므로, 이후 python, pip3는 가상환경 안의 것이 잡힌다. 이 상태에서 pip list를 다시 쳐 보면 아무 패키지도 없는 깨끗한 환경이 나온다.
터미널에서 켰다고 VS Code까지 켜진 건 아니다
여기서 놓치기 쉬운 부분이 있다. VS Code 터미널 프롬프트 앞에 (myenv)가 붙어 있어도, 그건 터미널 셸만 가상환경을 쓰고 있다는 뜻이다. VS Code가 코드를 실행하고 분석할 때 쓰는 인터프리터는 따로 설정된다. 터미널의 가상환경과 VS Code의 인터프리터는 별개라서 둘 다 맞춰야 한다.
맞추는 방법은 세 가지다.
VS Code 하단 상태 표시줄의 Python 버전 정보를 클릭하고, 만든 가상환경 이름을 고른다.
ctrl + shift + p(Windows) /cmd + shift + p(Mac)로 명령 팔레트를 열고 “Python: Select Interpreter"를 입력한 뒤, 가상환경 이름이 들어간 인터프리터를 고른다.가상환경을 만든 직후 뜨는 알림창에서 바로 선택한다.

가상환경을 만들면 VS Code Python 확장이 이렇게 물어 온다. “예"를 누르면 작업 영역의 인터프리터가 새 가상환경으로 바뀐다.
터미널 활성화와 인터프리터 선택은 순서가 상관없지만, 둘 중 하나만 해서는 안 된다.
패키지 목록은 requirements.txt로 옮긴다
가상환경이 켜진 상태에서 설치하면 패키지는 myenv 안에만 들어간다.
pip3 install {패키지명}
설치한 목록은 pip3 freeze로 뽑는다. 패키지 이름과 버전이 이름==버전 형식으로 나온다.

pip3 freeze 출력 예시다.
이 출력을 파일로 저장해 두면 백업이 되고, 다른 가상환경에서 같은 목록을 그대로 설치할 수 있다.
# 현재 가상환경의 패키지 목록을 파일로 저장
pip3 freeze > requirements.txt
# 다른 가상환경에서 같은 버전으로 설치
pip3 install -r requirements.txt
끄고 지우기
비활성화는 한 줄이다.
deactivate
삭제는 더 간단하다. 가상환경은 폴더 하나라서 myenv 폴더를 지우면 끝이다. 탐색기에서 우클릭해 삭제하거나 터미널에서 지운다.
rm -rf myenv
시스템 패키지를 가져가고 싶을 때
새 가상환경은 아무 패키지도 없는 백지에서 시작한다. 로컬 시스템에 이미 깔린 패키지를 가상환경에서도 쓰고 싶다면 --system-site-packages 옵션을 붙여 만든다.
python3 -m venv myenv --system-site-packages
이렇게 만든 뒤 pip3 list를 치면 시스템에 설치된 패키지까지 목록에 나온다. 이때 가상환경에 따로 설치한 패키지만 보고 싶으면 --local을 붙인다.
pip3 list --local
정리
정리
가상환경은 프로젝트 폴더 안의 폴더 하나다. 만들 때
python3 -m venv, 지울 때는 폴더 삭제.activate는 셸의 PATH만 바꾼다. VS Code 인터프리터는 따로 골라야 한다.패키지 목록은
pip3 freeze > requirements.txt로 남기고pip3 install -r로 되살린다.