Python 가상환경 venv 간단한 사용법 + 주의사항

2018. 11. 12. 18:43Programming/Python

최근에 Python 사용할 일이 늘었습니다. 아직은 학생이라서 PyCharm 학생 계정으로 1년간 프로버전을 무료로 사용 중인데, 이건 프로젝트를 생성할 때 가상환경 venv를 자동으로 생성해주더군요.

사실 가상환경을 왜 쓰는지 처음에는 이해가 안 갔는데, 요즘 docker도 써보고 node.js도 써보니 이해가 갑니다.

어떤 프로그램을 만들 때, 보통은 독자적으로 파이썬의 순수한 고유 라이브러리만 써서 만들기도 하지만, 다른 사람이 개발한 라이브러리도 같이 포함해서 만들게 됩니다. 즉, 의존성이 생기게 됩니다.

이 의존성 문제 때문에, 자기 컴퓨터에서 정상적으로 돌아가던 프로그램이라 할 지라도, 다른 컴퓨터에 설치하였을 때 그것이 정상적으로 작동하리란 보장이 없습니다. 파이썬 인터프리터도 버전에 따라 기능의 차이가 있고, 모듈들도 여러가지 버전이 있기 때문에, 다른 컴퓨터 환경이 자신의 컴퓨터 환경과 똑같은 파이썬, 똑같은 모듈을 쓰는 게 아니고서야 이런 위험이 항상 뒤따르게 되는 것이죠.

이 의존성 문제를 해결하기 위한 방법은 여러가지가 있을 수 있습니다. 가장 확실하지만 가장 무식한 방법은, 프로그램을 배포할 때 환경까지 같이 맞추도록 하는 것입니다. 내 PC에 Python 3.5, requests 모듈 2.18.4 버전, beautifulsoup4 모듈이 4.6.0 버전으로 설치되어 있었다면, 배포되는 상대방 PC에도 똑같은 버전의 파이썬, 똑같은 버전의 requests와 똑같은 버전의 beautifulsoup4를 설치하게 하는 것이죠.

이렇게 하면 의존성 문제가 발생할 일은 없겠습니다만 만일 한 개가 아니라 여러 종류의 파이썬 프로그램을 설치한다면 문제가 복잡해집니다. 프로그램 하나에 파이썬을 새로 하나씩 받아서 모듈도 새로 하나씩 받는다면 비효율도 이런 비효율이 따로 없겠죠.

파이썬의 가상환경은 이런 문제를 해결하기 위해 등장했습니다. 특정 앱 실행만을 위한 파이썬 환경을 따로 만들어서, 그 환경 속에서만 모듈을 관리하고, 앱을 실행시켰다가, 다른 앱을 실행할 일이 있으면 그 가상환경을 빠져나가는 방식으로 작동합니다. 말은 조금 어렵습니다만, 예제를 보면 금방 이해가 갈 겁니다.

예전엔 파이썬 가상환경이 파이썬에서 자체적으로 제공되는 것이 아니라, 별도의 패키지로 설치해야만 했습니다. virtualenv 같은 모듈이 그러했는데, 버전 3.5 이후부터는 파이썬에서도 venv라는 이름으로 가상환경 모듈을 지원합니다.

윈도우, 리눅스, 맥 구분 없이 가상환경 생성하는 방법은 동일합니다.

python -m venv /path/to/venv

path to venv에는 가상환경을 구성하고 싶은 폴더 경로를 적으면 됩니다. 해당하는 폴더가 존재하지 않으면 파이썬이 알아서 생성해서 가상환경을 구성합니다.

만일 PC에 설치된 파이썬이 여러 종류라면, 해당 파이썬이 있는 절대경로를 입력해서 사용하면 됩니다.

위 명령어를 실행하고 조금 기다리면 가상환경이 생깁니다.

위 이미지는 윈도우 기준 가상환경을 생성하는 명령어입니다.

venv라는 폴더가 생성되고, 내용물을 열어보면 위와 같습니다. 윈도우라면 Scripts 폴더가 생성되고, 리눅스나 Mac일 경우엔 bin 폴더가 생성됩니다.

윈도우 기준 Scripts 폴더에 들어가보면 위와 같이 파이썬 인터프리터, pip, 그리고 activate.bat이 들어있는 걸 확인할 수 있습니다.

해당 경로에서 activate.bat를 실행하면 가상환경을 활성화할 수 있습니다.

리눅스/맥 기준에서는

source ./venv/bin/activate

를 실행하면 됩니다.

activate.bat 혹은 activate를 실행하면 (venv)라는 프롬프트가 앞에 붙게 됩니다. 이 상태에서는 python이나 pip를 콘솔에서 호출하더라도, 원래 설치되어 있는 python과 pip가 아니라 venv 내부에 있는 python과 pip가 호출됩니다.

즉, pip install을 통해 모듈을 설치하더라도 venv 폴더 내부에만 설치가 될 뿐, 본래의 파이썬 모듈에 설치되지 않습니다.

한번 venv를 활성화한 상태에서 pip install pyinstaller를 실행하여 pyinstaller 모듈을 설치해 보겠습니다.

설치가 완료된 후에 pyinstaller -h를 실행하면 정상적으로 도움말이 표시됩니다.

이번엔 가상환경을 끄고나서 같은 명령어를 입력해보겠습니다.

참고로 가상환경 비활성화를 하고 싶으면 윈도우 환경에서는 Script 폴더의 deactivate.bat를 실행, 맥과 리눅스 환경에서는 deactivate를 바로 입력하면 가상환경에서 나갈 수 있습니다.

deactivate를 하고 pyinstaller -h를 호출하면, 존재하지 않는 명령어라고 표시됩니다.

이렇듯, 애플리케이션에 따라 파이썬의 환경을 다르게 설정하고 싶다면, 가상환경을 따로 구축해서 pip 등을 이용해 모듈 관리를 하면 편리하게 관리할 수 있습니다.

자세한 매뉴얼은 아래의 링크에서 확인하실 수 있습니다.

https://docs.python.org/ko/3/library/venv.html#module-venv

FAQ. 가상환경의 폴더 이름을 바꿨는데 동작이 안 돼요!!

venv 안에 존재하는 쉘 스크립트는 VENV 경로를 고정해서 쓰고 있습니다.

이 글은 2021년 6월 20일 기점으로 갱신되었습니다.

venv를 활성화하는 스크립트는 내부적으로 VIRTUAL_ENV 라는 환경변수를 고정해서 쓰고 있습니다. 따라서, 가상환경 생성 후에 폴더 이름을 변경하면 정상적으로 경로를 잡지 못합니다.

이를 해결하는 방법은 두 가지가 있습니다.

Solution1. 쉘 스크립트를 수정한다(max OS, Linux에만 해당)

venv/bin 폴더 내에 activate가 3개가 있습니다. 여러가지 쉘에서 실행할 수 있도록 3가지 쉘스크립트로 내놓은 것인데, 아무 확장자가 없는 activate가 bash에서 작동될 수 있는 쉘스크립트입니다. 원래대로라면 3가지를 전부 다 수정해야겠지만, 저같이 bash에서만 사용할 것이라면 activate만 수정해도 무방합니다.

activate 파일에서 VIRTUAL_ENV 부분을 찾아서 경로를 알맞게 수정하면 됩니다.

이후, 한가지 더 작업을 해줘야 합니다. pip와 pip3 또한 shebang 경로가 그대로 있으므로 열어서 수정을 해줘야합니다.

가장 첫째 줄의 #! 부분이 shebang입니다. 발음에 주의하도록 합시다. 이는 스크립트 실행 프로그램을 명시해주는 구문이므로 이 부분도 알맞게 수정해야만 합니다. pip와 pip3를 전부 수정해주도록 합시다.

Solution2. venv를 재설치한다. (모든 OS에서 사용 가능)

아래 명령어를 실행해줍니다.

pip freeze > requirements.txt

freeze 명령어는 현재 venv(혹은 파이썬 기본 인터프리터)에 설치되어 있는 라이브러리의 이름과 버전을 따로 추출하는 명령어입니다. 뒤에 `> requirements.txt`를 붙이면, 해당 결과를 requirements.txt에 저장하게 됩니다.

가상환경에 설치되어 있는 라이브러리를 따로 뽑아낸 결과물

이후, 가상환경을 지웁니다.

rm -rf ./venv
실수로라도 rm -rf /* 같은 명령어를 날리는 일이 없도록 조심하세요.

이후 재설치를 하되, requirements.txt의 파일을 읽도록 지정해주면 됩니다.

python -m venv /path/to/venv
source /path/to/venv/bin/activate
pip install -r requirements.txt

pip install에서 -r 옵션을 지정하면, 특정 파일로부터 의존성 정보를 읽어서 설치해줍니다.

이 방법은 의존성 정보를 그대로 가지고 새롭게 가상환경을 재구축하는 방법이므로, 윈도우에서도 사용 가능합니다. 저는 가급적 이 방법을 권장드립니다.