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의 인터프리터는 별개라서 둘 다 맞춰야 한다.

맞추는 방법은 세 가지다.

  1. VS Code 하단 상태 표시줄의 Python 버전 정보를 클릭하고, 만든 가상환경 이름을 고른다.

  2. ctrl + shift + p(Windows) / cmd + shift + p(Mac)로 명령 팔레트를 열고 “Python: Select Interpreter"를 입력한 뒤, 가상환경 이름이 들어간 인터프리터를 고른다.

  3. 가상환경을 만든 직후 뜨는 알림창에서 바로 선택한다.

가상환경을 만들면 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로 되살린다.