«   2023/02   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
Archives
02-02 00:06
관리 메뉴

ulismoon

[Python] 독립적인 가상의 파이썬 실행환경, virtualenv (1) 본문

Development

[Python] 독립적인 가상의 파이썬 실행환경, virtualenv (1)

ulismoon 2016. 5. 12. 03:00

다양한 프로젝트, 수많은 패키지, 복잡한 의존성...

파이썬으로 개발을 하다보면 거의 항상 복수의 패키지를 설치, 사용하게 된다. 그런데 이걸 다 그냥 깔아버리면 해당 패키지는 그 컴퓨터에서 사용하는 모든 파이썬 패키지에 영향을 주게 되고, 이는 많은 문제를 일으킬 수 있다.


예를 들어 프로젝트 A, B가 동일한 X 라는 패키지를 사용한다고 하자.


그런데 A 프로젝트는 모종의 사정으로 X의 1.0 버전을 사용해야 하고, B는 최신버전인 X의 2.0을 사용하게 되었다면, 컴퓨터에는 어떤 버전을 설치해야 할까?


단순히 생각했을 때에는 2.0이 최신이니 2.0을 깔면 될 것이라고 생각하지만, 파이썬2 가 파이썬3 으로 넘어오면서 하위호환을 버린 것을 생각하면 무작정 최신버전을 깔아놓는 것은 패망의 지름길이다.


"프로젝트별로 패키지 버전을 명시해놓고 작업할때마다 패키지를 계속 깔게 하면 어떨까? 그러면 매번 그 프로젝트에서 사용하는 버전을 사용하니까 문제 없는거 아냐?" 라고 생각하신다면 numpy나 pandas 같은 패키지를 한번 깔아보시길 추천드린다. 이런 거대한 패키지는 설치하는 데만 수 분 이상이 소요된다. 단지 다른 프로젝트를 빌드하고 싶은 것뿐인데 패키지 설치하느라 시간을 수~수십분씩 날려먹는 건 바보같은 짓이다.


그냥 봐도 썩 좋아보이지 않는다...


내가 불편하면 남들도 불편하던데.... 누가 만들어놓은거 없나...

이 문제를 해결하기 위한 이론적으로 최선의 방안은 무엇일까? 그야 당연히 프로젝트별로 독립된 실행환경을 가지도록 해주면 아무 문제 없을 것이다. 루비 진영의 경우 rbenv라는 것을 이용해 이러한 독립 환경을 구축하고 사용한다.


파이썬에서 이와 같은 역할을 해주는 패키지가 바로 virtualenv 라는 패키지이다. 공식 문서에서는 뭐라고 하고 있는지 살펴보자.


virtualenv is a tool to create isolated Python environments.


고립된 파이썬 환경을 만들어준단다. 매우 바람직하다. 어떻게 쓰는건지는 아직 모르겠지만 이걸 쓰면 깔끔하게 분리된 여러 개의 파이썬 실행 환경을 가질 수 있을 것 같은 기분이 든다. 그럼 본격적으로 virtualenv에 대해 살펴보자.


virtualenv 설치, 사용

*nix + python 2.7 기준으로 pip를 이용해 패키지를 설치하면 /usr/lib/python2.7/site-packages 같은 곳에 패키지가 설치된다. 문제는 저 /usr/lib 이라는 게 시스템 전체에 영향을 주는 위치라는 것이다. virtualenv는 시스템 환경변수의 PATH를 적절히 조작해 파이썬을 완전히 독립된 환경에서 사용할 수 있게 해준다.


그럼 직접 ubuntu 의 따끈한 LTS인 16.04에 virtualenv를 설치하면서 환경변수를 어떻게 만져주는지 확인해보자.


일단 virtualenv를 쉽게 설치하기 위해 시스템에 pip를 먼저 설치하자. 링크를 파일로 저장해 파이썬으로 실행시키면 된다. sudo 권한으로 실행해야 에러 없이 설치할 수 있다.


virtualenv가 독립된 가상환경을 만들어준다고 했는데, 이를 위해 virtualenv 자신만큼은 시스템에 설치를 해야 한다. 왠지 가상환경을 만들기 위해 시스템에 패키지를 설치해야 하는 게 모순인 것 같아 보인다. 그리고 사실 이것조차도 해결할 수 있는 방법이 있지만, 상당히 귀찮으므로 패스.. virtualenv는 다음 명령어로 쉽게 설치가 가능하다.


한 거 없는데 설치가 끝났다. 이제 virtualenv를 사용하기만 하면 된다. ㄹㅇ.


사용법도 설치법만큼이나 간단하다. 내가 가상환경을 만들고 싶은 폴더로 가서 다음 명령어처럼 가상환경을 만들어주기만 하면 된다.

[env_name] 자리에는 원하는 아무 이름이나 써도 상관 없으나, 통상적으로 env, venv, .env, .venv 등이 사용된다.


가상환경을 생성은 했지만 그냥 이걸 쓸 수 있는게 아니라 이 환경을 사용하기 위해 활성화를 해야 한다. [env_name]/bin/activate 라는 파일을 실행하면 만들어놓은 가상환경을 실행할 수 있다.

그럼 쉘의 앞단에 ([env_name]) 이라는 문구가 추가되는 것을 볼 수 있다. 이제 우리가 작업하는 모든 파이썬 관련 환경은 이 곳을 기준으로 한다. 주의할 점은, 이 디렉터리에서 나가 어디를 가더라도 파이썬을 사용하는 환경은 현재 활성화중인 가상환경이라는 것이다. 비활성화를 까먹고 다른 프로젝트에 가서 작업을 하면 골치아픈 상황이 생길 수도 있으니 먼저 비활성화 명령부터 알고 가자. 비활성화 명령은 활성화 명령보다 짧다.
보통 탭으로 자동완성을 할 수 있으니 다 두들기지 않아도 쉽게 활성화/비활성화를 할 수 있다.


그럼 실제로 virtualenv를 사용하면 파이썬 개발환경이 완전히 분리되는지 확인해보자. 두 개의 프로젝트에 각각 virtualenv를 만들고 다른 버전의 sqlalchemy 패키지를 설치해 보았다. 문제 없을까?


맨 밑에서 두 번째 줄을 보면 서로 다른 버전의 SQLAlchemy가 문제 없이 공존(?)하는 것을 확인할 수 있다.


이것으로 virtualenv를 간편하게 설치하고 사용하는 것을 알아보았다. 좀 더 자세한 내용까지 다루려고 했는데 내용이 길어져 둘로 나눠야 할 것 같다. 다음 편에서는 좀 더 자세하게 환경변수를 어떻게 바꾸는지 확인해 virtualenv에 대해 조금 더 깊은 이해를 도모해보겠다.


tl;dr

virtualenv를 사용하면 파이썬 가상환경을 만들어 다른 프로젝트의 영향을 받지 않고 개발할 수 있다.
환경을 구축할 디렉터리에서 virtualenv [env_name] 으로 가상 환경을 만들면 된다.
[env_name]/bin/activate :: deactivate 명령으로 가상환경을 활성화/비활성화할 수 있다.
주의: 한번 활성화된 가상환경은 수동으로 비활성화하기 전까지 유지된다. 다른 프로젝트로 가기 전에 꼭 비활성화해 환경이 꼬이지 않도록 하자.


ps. 자동으로 현재 디렉터리에 있는 virtualenv를 잡아주는 autoenv 같은 것들도 있다. 활용하면 좋을지도..


2 Comments
댓글쓰기 폼