티스토리 뷰

개발/python

가상환경(virtualenv)과 jupyter

Jaeyeon Baek 2017.09.06 10:12

python 이 매력적인 (많고 많은) 이유 중에 여기서 두 가지 뽑자면,

◎ 하나의 머신에서 독립적인 가상환경 (여러가지 방법으로) 구축이 쉽다.
◎ 웹에서 강력한 인터프리터 IDE (jupyter notebook)를 사용할 수 있다.

우선 첫 번째 언급 된것 처럼 우리는 하나의 머신(PC, 서버, 클라우드 등)에서 로컬 환경을 더럽히지 않고 독립된 가상공간을 만들어 python 프로젝트를 운영할 수 있다. 이 말의 뜻은, 흡사 virtualbox 처럼 hostOS 위에 가상의 VM 을 올려서 독립적으로 운영하는 것과 유사한 개념으로 볼 수 있다. hostOS 위에 올라간 VM 은 서로 간섭 없이 운영될 수 있다. 즉, 두 개의 VM 에 각각 설치된 모듈이나 라이브러리는 다른 VM 에 영향을 주지 않는다 (요즘은 docker container 로 비유하는게 더 적절할지도). 이런 개념을 python 에서도 사용할 수 있는데, python 프로젝트를 가상화 할 수 있는 방법은 anaconda, virtualenv 등 여러가지가 있을 수 있다. 여기서는 virtualenv 를 설치, 가상환경 구축, 가상환경 접속, 세 단계를 통해 다뤄보도록 한다.

1. 설치

# python3 의 경우 pip3 사용
$ pip install virtualenv

2. 가상환경 구축

# envname 은 가상환경 이름으로 사용자 임의로 지정, 경로까지 포함할 수 있다.
$ virtualenv envname

virtualenv 인자로 경로를 줄 때 가상환경을 모아 놓는 기본 디렉터리를 관리해주면 나중에 편하다. 예를 들어 홈 디렉터리 밑에 모아 놓는다던지 말이다 (e.g virtualenv ~/env/testall). 또한 가상환경을 생성할 때 python 버전도 선택할 수 있다. 가상환경이 구축된 다음에도 jupyter 에서는 멀티커널(python2 와 3을 같이 사용)을 설정할 수 있기 때문에 그 부분도 별도로 확인해보면 좋다. (버전 선택은 p 옵션을 주면 된다.  virtualenv -p python3 envname  처럼 말이다.)

이렇게 쉽게 가상환경이 뚝딱 만들어졌다. 이제 가상환경에 접속을 하면 된다.

3. 가상환경 접속

$ source envname

접속하면 프롬프트 앞에 가상환경의 이름이 노출되기 때문에 현재 접속중인 환경을 알 수 있다.

가상환경에서의 종료는 deactivate 라는 명령어를 사용하면 된다. 

이렇게 가상의 환경을 운영하는 것의 최대 장점은 앞서 언급한 것처럼 로컬 환경을 더럽히지 않는다는 것이다. 예를들어 foo 라는 모듈을 개발한다고 할 때 여러가지 필요한 라이브러리가 추가로 설치되는 경우가 있는데, 로컬 환경에는 이미 라이브러리가 모두 설치되어 있기 때문에 최종 테스트에 문제가 없다. 하지만 새로운 머신에서 foo 모듈을 테스트 한다고 했을 때 필요한 라이브러리가 없기 때문에 모듈은 정상적으로 동작하지 않고 에러를 내뱉게 된다. 

이런 문제 해결을 위해 개발자는 새로운 가상환경을 생성해서 개발 하고, 다른 가상환경에서 테스트 하는 방법을 사용 할 수 있다. 또한 python2 가상 환경과 python3 가상 환경을 분리해서 모듈 테스트를 한다던지, 프로젝트별로 가상환경을 관리한다던지 다양하게 활용할 수 있겠다. 프로젝트가 많지 않을 때는 requirements.txt 를 적극 활용하면 되겠지만 한 개의 머신에서 계속 개발을 하게 되면 필연적으로 여러가지 라이브러리가 섞일 수 밖에 없다. 가상환경은 이러한 문제를 해소해준다.

이렇게 윤택한 가상환경에 jupyter notebook 까지 사용할 수 있으면 금상첨화. 로컬에 노트북을 바로 설치하게 되면 가상환경에서 인스톨하는 라이브러리가 인식되지 않는다. 고로 가상환경을 생성했으면 그 안에 jupyter 을 설치해주는 것이 좋다. 설치는  pip install jupyter  로 가능하다. 혹시 로컬환경에도 jupyter 가 설치되어 있고, 가상환경에도 설치되어 있다면 환경변수에 따라 대부분 로컬에 있는 jupyter 가 실행된다. 즉, jupyter 내부에서 사용하게 되는 모든 python 라이브러리는 로컬에 의존적이다. 잘 구분해서 사용할 수 있도록 하자.

혹시 설치 되어 있는 jupyter 를 삭제하고자 한다면 아래와 같은 방식으로 진행하면 된다. 

우선  pip freeze  라는 명령으로 설치되어 있는 라이브러리 중에 jupyter 문자열을 찾고나서 하나씩 uninstall 해주는 과정이다. 깔끔하게 /usr/local/bin/jupyter* 까지 삭제해주면 더욱 좋다. (위 예제는 가상환경에서 jupyter 를 삭제하는 것이라 적절하지 않을 수 있지만 로컬도 다르지 않다.)

python 은 대세답게 이미 많은 환경과 시스템을 제공하고 있다. 그 세계관을 이해하고 적절하게 활용하면 자연스럽게 python 이라는 로켓에 올라탈 수 있겠다.



댓글
댓글쓰기 폼