본문으로 바로가기

프로젝트별 독립된 실행 환경은 왜 필요할까

패키지들 간의 의존성 문제라고 들어본 적이 있을까. 어떤 패키지가 아직 설치되지 않은 다른 패키지를 필요로 하거나, 특정 버전 이상 혹은 이하의 패키지 버전만을 필요로 한다면 그 패키지들 간에는 서로 의존성이 있음을 나타낸다. 규모있는 여러 프로젝트를 동시에 진행하고 있다면, 패키지들 간의 의존성 문제로 인해 프로젝트마다 서로 다른 파이썬 버전과 서로 다른 패키지 버전을 사용해야 하는 경우가 발생하게 된다.  예를 들어, opencv-python 패키지를 사용하려면 numpy를 반드시 필요로 한다. 패키지 관리자를 통해 패키지를 설치해보면 (보통 numpy를 함께 설치 할지 여부에 대한 질문에 생각없이 yes를 입력하게 되면서) 나도 모르는 사이 numpy가 함께 설치된다. 내가 프로젝트에서 numpy를 사용하지 않고 있다면 다른 곳에서 해당 패키지를 사용하지 않아 설치에 큰 문제가 없지만, 기존에 numpy를 사용하고 있다면 기존 다른 패키지와의 의존성을 잘 확인하여 numpy를 업데이트하거나 버전을 낮춰야 할 수도 있다. 

프로젝트에 여러 패키지를 가져와서 사용하다 보면 패키지들 사이의 의존 관계가 복잡해지게 되는데, 패키지에 새로운 버전이 업데이트되면서 필요했던 기능이 추가되어 업데이트하고 싶더라도 내가 사용하고 있는 다른 패키지 간의 의존성 때문에 업데이트를 하지 못하는 경우도 발생하게 된다. (그래서 의존성 문제로 골머리를 썩히고 싶지 않다면, 의존성 있는 다른 패키지 업데이트에 맞춰서 활발하게 업데이트가 일어나는 활성화된 패키지들을 가져와서 사용해야 한다)

이 포스팅은 (독립된 실행 환경 구축에 관한 이야기라 패키지 관리자에 대한 이야기를 오래 할 순 없지만) 이러한 의존성 문제 때문에라도 패키지 관리자를 사용해 패키지를 설치하기를 권장한다.  pip와 같은 패키지 관리자들은 새로운 패키지를 설치, 삭제, 업데이트 할때마다, 나도 모르는 새에 사용하던 패키지가 업데이트되는 것을 방지하기 위해 패키지들 사이의 의존 관계를 확인해주고 있다.

패키지 의존성에 대해서 그림으로 이해해 보자

아래 이미지에서 처럼 서로 다른 버전의 파이썬을 사용하는 프로젝트 A와 프로젝트 B를 예를 들어보자.

위와 같이 두 프로젝트는 서로 사용하는 파이썬의 버전도 다를 뿐만 아니라,  동일한 패키지 (aaa)임에도 각 프로젝트에서 사용하는 다른 패키지(bbb, ccc) 과의 패키지 의존성 문제로 인해 서로 다른 버전을 설치해야 하는 경우가 발생한다. 이처럼, 서로 다른 두 프로젝트가 파이썬 버전과 패키지 버전을 서로 다르며, 하나의 컴퓨터에서 두 개 이상의 프로젝트를 진행해야 한다면 (사실 설령 단 하나의 프로젝트를 진행하더라도) 하나의 프로젝트 작업이 다른 프로젝트에 영향을 끼치지 않기 위해선 독립된 실행 환경을 구축할 필요가 있는 것이다.

무엇으로 독립된 실행 환경을 구축할 수 있을까

이 포스팅에서는 virtualenv를 사용하여 독립된 개발 환경을 구축할 예정이다. Python3.3부터 venv 모듈이 표준 라이브러리로 통합되어 있으나 venv 모듈은 virtualenv에서 제공하는 많은 기능들을 제공하고 있지 않다(고 문서에 나와있다). virtualenv는 pip3를 통해 버전을 업그레이드 하기가 쉬우며, 다른 Python 버전들을 다루기 쉽고 좀더 진보된 기능들이 탑재되어 있다. (virtualenv tutorial)  virtualenv를 활용해서 환경을 구축하는 방법은 다음 포스팅에서 상세히 진행하도록 하겠다.

 virtualenv는 어떤 방법으로 동작하는가

virtualenv는 시스템 환경 변수의 PATH를 적절히 조작하여 파이썬을 완전히 독립된 환경에서 사용할 수 있도록 해준다. 파이썬을 호출하면 환경변수에 나열된 순서대로 $PATH의 맨 앞 부분부터 사용할 Python 버전과 패키지 목록이 있는지 확인하기 때문에 가능한 일이다.

virtualenv에서는 가상 환경을 시작하는 명령어를 실행하면 $PATH 맨 앞에 가상환경 디렉토리를 삽입하여 현재의 프로젝트에서 사용할 파이썬의 버전과 패키지 버전을 새롭게 명시해주는 것이다. 

맥에서 터미널을 켜서 환경 변수를 확인해보자.

1
2
3
 
echo $PATH
 
cs

 

echo $PATH 결과

우리가 직접 path를 조작하기 위해서는 디렉토리 최상단으로 이동하여 숨겨진 파일인 .bash_profile 파일을 수정하면 된다. 참고로, 숨겨진 파일은 .으로 시작하며 기본적인 ls 명령어로는 파일이 있는지 확인 할 수 없는데 터미널에서 숨겨진 파일도 함께 확인하고 싶다면 ls -a 명령어를 입력하면 된다.

1
2
cd ~
vi .bash_profile
cs

.bash_profile을 수정하기

:를 입력하고 q를 입력한다음 엔터를 치면 빠져나올 수 있다. 나도 vi, vim을 활용하는 방법은 깊게 모르기 때문에 나중에 공부해서 추가할 예정이다. 

※ 주의해야 할 점,

한번 활성화된 가상 환경은 수동으로 비활성화하기 전까지는 유지되기 때문에, 다른 프로젝트 작업을 시작하기 전에 반드시 비활성화 해주어야 개발 환경이 꼬이지 않게 된다.