어떤 파이썬 가상 환경이 나에게 알맞을까?
가상 환경은 신입 프로그래머들에게 비교적 이해하기 어려운 내용이다. 초짜 시절 가상 환경을 사용하면서 내가 이해한 것은 고작 MacOS나 Windows에서 내 환경이 존재하고 PyCharm을 사용하며, 실행하면 코드가 잘 실행된다는 것뿐이었다.
그러던 도중 데이터 과학이나 머신러닝 엔지니어로서의 경력을 쌓게 되면서, 파이썬 프로젝트 진행 간 눈물 나는 의존성 문제를 종종 겪었고, 아마추어로서 여러 가지 상황을 부닥치며 가상 환경에 대해 깊이 학습하게 되었다. 이런 잡다구리 한 것들을 알아내는데 생각보다 시간이 오래 걸렸다.
이러한 시행착오를 바탕으로 각각의 가상환경의 특성에 대해 조금이나마 이해하게 되었다.
이번 글에서는 가장 흔한 4가지 가상 환경과 언제/왜 어떤 것을 사용해야 하는지에 대해 살펴본다.
VENV
VirtualEnv(혹은 Venv)는 대부분의 프로그래머들에게 기본 가상 환경이었다(지금도 여전히 그렇다). 다음과 같이 pip을 사용하여 설치할 수 있다.
pip install virtualenv
설치 후, 가상 환경을 생성하고 싶은 디렉터리로 이동해서 다음 명령어를 실행한다.
python3 -m venv env
가상 환경환경을 사용하기 위해서는 가상 환경을 활성화시켜야 한다.
source env/bin/activate
이제 필요한 라이브러리들을 설치해보자.
pip install requests
이전에 사용하던 환경과 동일한 라이브러리를 다른 환경에서도 사용하기 위해서는 다음과 같이 입력해서 사용하는 라이브러리를 텍스트 문서에 모두 기입해준다.
pip freeze > requirements.txt
해당 텍스트 파일에 적혀있는 라이브러리를 새로운 가상 환경에 설치하려면 다음과 같이 입력해주면 된다.
pip install -f requirements.txt
requirements.txt 파일을 열면 라이브러리 패키지의 버전을 확인할 수 있다.
마지막으로 가상 환경을 비활성화하려면 deactivate 명령어를 사용하여 가상 환경을 종료할 수 있다. 활성화된 상태에서 설치된 라이브러리들은 그대로 남아있으므로 다시 활성화한 후 재설치할 필요가 없다.
지금까지는 가상 환경을 수동으로 생성한 후 활성화하고 기존에 사용하던 환경을 수동으로 복사(freeze)해서 requirements를 저장해야 했다. 하지만 굳이 이 두 가지 과정을 거치지 않아도 되지 않을까?
이제 pipenv를 살펴보자.
PipEnv
venv가 여전히 파이썬 최신 버전과 함께 제공되는 공식적인 가상 환경 툴이지만, Pipenv가 파이썬 생태계에서 우위를 점하고 있다.
좀 전의 예시를 보자. venv에서 동일한 컴퓨터에 여러 프로젝트를 실행하기 위해서는 최소한 다음과 같은 것들을 설치해주어야 한다.
- 가상 환경을 위한 툴 (ex. venv)
- 패키지 설치를 위한 또 다른 패키지(pip, easy_install)
- 가상 환경을 관리하기 위한 툴/유틸리티(virtualenvwrapper, pyenv)
Pipenv는 위의 모든 것들은 물론, 더 많은 것들을 포함하고 있다.
게다가, Pipenv는 reqirements.txt와 pip freeze에 비해 의존성 관리를 정말 잘 처리한다. Pipenv는 설치할 때 pip를 이용한 설치처럼 종속성을 고려해 설치하며, 충돌이 발생하더라도 pipenv graph 명령어를 이용해 dependency tree를 확인할 수 있다.
pip env를 설치하기 위해서는 우선 pip를 설치해야 한다. 이후 다음 명령어로 설치해주자.
pip install pipenv
이후 새로운 환경을 생성하면 된다.
pipenv install
처음에 pipenv 파일을 찾고, 만약 존재하지 않으면 새로운 환경을 만들어서 활성화시킨다.
가상 환경을 활성화시키기 위해서는 다음과 같이 간단히 실행시켜주면 된다.
pipenv shell
새로운 패키지를 설치하기 위해서는 pip install <package>를 이용해 간단히 설치할 수 있으며, pipenv는 pipfile이라는 파일에 패키지를 자동으로 추가해 놓는다.
또한 다음과 같이 입력하면 개발 환경 전용 패키지를 설치할 수도 있다.
pip install <package> --dev
지금의 가상 환경을 그대로 고정시키고 싶다면 다음과 같이 입력해보자.
pipenv lock
이렇게 하면 pipfile.lock이 생성/업데이트된다.
pipenv install --ignore-pipfile
위 명령어는 pipfile을 무시하고 pipfile.lock에 있는 것을 사용하도록 한다. 하위 종속성 등 모든 면에서 동일한 환경을 만들어 준다.
lock file은 환경에서 모든 패키지 버전의 스냅숏을 생성하여 빌드를 가능하게 한다(pip freeze 결과와 유사함).
여기 있다! 이제 우리는 pipenv와 venv를 비교했고 pipenv가 훨씬 쉬운 해결책이라는 것을 보여주었다.
pipenv와 venv를 비교했고 pipenv가 훨씬 쉬운 해결책이라는 것을 보여주었다.
Conda Environment
아나콘다는 Python 초보자들에게 가장 좋은 환경이다. 설치가 간편하기 때문이다. 나도 종종 콘다를 이용해 가상 환경을 사용해 왔으며, 회사의 프록시 환경으로 인해 설치가 잘 되지 않던 패키지들이 이상하게도 콘다 환경에서는 설치가 잘 되었기 때문이다. 아나콘다는 독자적인 가상 환경 시스템인 conda를 갖고 있다.
가상 환경을 생성하기 위해선 다음과 같이 명령어를 입력한다.
conda create --name <환경이름> python=<파이썬버전>
conda create --name env_name python=3.7
현재 현경을 재생성하기 위한 정보를 다음 명령어로 파일에 저장할 수 있다.
conda env export > environment.yml
재생성하기 위해서는 다음과 같이 입력한다.
conda env create -f environment.yml
활성화와 비활성화는 다음과 같다.
conda activate <환경이름> #활성화
conda deactivate #비활성화
내 경험상 콘다도 좋긴 하지만 최근에는 venv를 더 선호한다.
이유는 프로젝트 진행 간 가상 환경 디렉터리를 프로젝트의 디렉터리 아래에 포함시켜서 고립된 가상 환경을 사용하는지 확실히 명시해줄 수 있기 때문이다. 또한 모든 환경에 동일한 이름을 사용할 수 있으므로 동일한 명령으로 각각 활성화시킬 수 있다.
Docker
이전 글에 도커와 사용법에 대해서 기록해 두었으므로, 관련 자료는 아래 글을 참고하면 된다.
Docker (1) - 입문자를 위한 Docker란 무엇인가?
Docker (2) - Ubuntu에 Docker 설치하기
Docker (3) - 기본 명령어 Cheat sheet(설치/삭제/실행 등)
Docker (4) - 3줄로 간단히 머신러닝/딥러닝 환경 구축하기(docker kaggle image 설치/활용하기)
도커는 도커 컨테이너를 생성시키는 라이브러리이다. virtualenv는 python 프로젝트의 종속성 구조만 보는 반면, 도커 컨테이너는 운영체제의 이미지 전체가 포함되어 있다. 가상 환경은 python의 의존성을 캡슐화 하지만 도커는 컨테이너는 OS 전체를 캡슐화한다.
이 때문에 virtualenv를 통해서는 파이썬 버전은 쉽게 바꿀 수 있었지만 결국 호스트 OS 내부에 갇혀있어야 했다. 하지만 도커 이미지를 사용하면 OS를 교체해버릴 수 있다. Ubuntu, Debian, Alpine, Windows Server Core에도 설치하고 실행할 수 있다.
내가 알고 있는 모든 OS와 Python 버전의 모든 조합에서 도커를 설치할 수 있다.
위에서 나열한 4가지의 가상 환경을 잘 생각해보면, 환경의 특성에 따라 쓰임새가 차이가 있다는 것을 알게 될 것이다.
아나콘다 환경을 많이 사용한다면 콘다를 사용하면 될 것이고 venv와 pipenv를 비교하자면 pipenv를 추천하고 싶다.
하지만 네 가지 중에 한 가지 만을 고르라면 무조건 도커를 추천하고 싶다. 도커는 광범위하게 퍼져있어서 어떻게 작동하는지 대략적인 이해 만하면 된다. 운영 체제 간의 이동성이 도커를 돋보이게 하는 요인이다. 서버의 OS환경에 대해 전혀 걱정할 필요가 없다.
Reference
댓글