안수찬 블로그

pyenv + virtualenv + autoenv 를 통한 Python 개발 환경 구축하기

Introduction

안수찬 @dobestan

안수찬 @dobestan

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com


pyenv + virtualenv + autoenv 를 통한 Python 개발 환경 구축하기

Posted by 안수찬 @dobestan on .
Featured

pyenv + virtualenv + autoenv 를 통한 Python 개발 환경 구축하기

Posted by 안수찬 @dobestan on .

본 문서는 소프트웨어 마에스트로 배권한 멘토님께서 제공해주신 자료를 바탕으로 작성되었습니다. 기본적으로 Mac OS X를 기준으로 작성되었습니다.

최근에 정말 다양한 환경에서 개발하고 있다. 전체적인 개발 환경을 한번 생각해보자. 어떤 서비스는 Ubuntu + MySQL, 어떤 서비스는 CentOS + Postgresql을 사용한다. 이런 OS나 패키지 Dependencies에 대한 부분은 VagrantDocker를 이용해서 해결한다.

하지만 언어나 프레임워크에 대한 의존은 어떻게 해결할 수 있을까? Ruby on Rails 같은 경우에는 RVM(Ruby Version Manager)을 이용해서 다양한 Ruby 를 설치하고 사용할 수 있다. 그리고 레일즈 설정파일은 Gemfile안에 사용할 루비나 레일즈 버전을 명시함으로써 이 문제를 해결한다.

그렇다면 Python에서는 이 문제를 어떻게 해결할까? 이 포스팅에서는 pyenv, virtualenv, 그리고 autoenv를 사용함으로써 이 문제를 명쾌하게 해결한다.

요약

  • pyenv : "Simple Python Version Management", 로컬에 다양한 파이썬 버전을 설치하고 사용할 수 있도록 한다. pyenv를 사용함으로써 파이썬 버전에 대한 의존성을 해결할 수 있다.
  • virtualenv : “Virtual Python Environment builder”, 로컬에 다양한 파이썬 환경을 구축하고 사용할 수 있도록 한다. 일반적으로 Python Packages라고 부르는 ( pip install을 통해서 설치하는 ) 패키지들에 대한 의존성을 해결할 수 있다.
  • autoenv : 만약 pyenvvirtualenv를 통해서 의존성을 해결한다고 하더라도 작업할때마다 설정해주는 것은 귀찮은 작업이다. 특정 프로젝트 폴더로 들어가면 자동으로 개발 환경을 설정해주는 autoenv라는 스크립트를 활용하자.

pyenv를 통한 파이썬 버전 관리

본 내용은 Github > yyuu > pyenv를 기반으로 작성되었습니다. 더 자세한 내용은 위의 링크에서 확인하실 수 있습니다.

pyenv 설치하기

user$ brew update  
user$ brew install pyenv  

pyenv virtualenv-init~/.bash_profile에 추가하기

user$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile  

물론 당연하지만 직접 ~/.bash_profileeval "$(pyenv virtualenv-init -)” 를 추가해도 된다. 만약 bash가 아니라 zsh을 사용한다면 ~/.zshrc에 추가하면 된다.

pyenv 사용하기

user$ pyenv version  
system (set by /Users/USERNAME/.pyenv/version)  

pyenv version을 통해서 지금 사용하고 있는 파이썬 버전이 무엇인지 확인할 수 있다. 만약 따로 설정하지 않았다면 기본적으로는 system. 즉, 시스템에 설치되어 있는 파이썬을 사용하고 있다고 알려준다.

user$ pyenv versions  
* system (set by /Users/Dobestan/.pyenv/version)
  2.7.8
  3.4.1
  my2.7.8python #파이썬 가상 개발 환경

컴퓨터에 설치된 파이썬 리스트를 보여준다. 만약 pyenv-virtualenv까지 설치했다면 파이썬 개발 환경 리스트도 모두 보여준다.

user$ pyenv install —list  

설치할 수 있는 파이썬 리스트를 보여준다. 만약 여기서 설치하고 싶다면 pyenv install 2.7.8과 같이 입력하면 된다.

user$ pyenv shell 3.4.1  
user$ python —version  
Python 3.4.1  

설치한 파이썬 버전을 사용하고 싶다면 어떻게 하면 될까? 바로 pyenv shell 2.7.8로 선택할 수 있다. 실제로 선택되었는지 확인하고 싶다면 $ python —version 이라고 입력을 해보자.

virtualenv를 통한 파이썬 개발 환경 관리

본 내용은 Github > yyuu > pyenv-virtualenv를 기반으로 작성되었습니다. 더 자세한 내용은 위의 링크에서 확인하실 수 있습니다.

virtualenv 설치하기

pypi > virtualenv는 단독 패키지로도 존재한다. 하지만 우리는 pyenv를 이용하여 virtualenv까지 관리할 예정이기에 pyenv-virtualenv 를 설치하여 사용하도록 하겠다.

user$ brew install pyenv-virtualenv  

pyenv init~/.bash_profile에 추가하기

user$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile  

물론 당연히 직접 eval "$(pyenv virtualenv-init -)”을 입력해도 된다. 만약 zsh을 사용하고 있다면 zshrc에 추가하자.

pyenv-virtualenv 사용하기

user$ pyenv virtualenv 2.7.8 my-virtual-env-2.7.8

user$ virtualenv versions  
* system (set by /Users/Dobestan/.pyenv/version)
my-virtual-env-2.7.8  

즉, pyenv virtualenv PYTHON_VERSION VIRTUAL_ENV_NAME 으로 새로운 개발 환경을 만들 수 있다. 가상 개발 환경을 추가한 상태로 virtualenv versions라고 입력하면 새롭게 추가된 환경을 확인할 수 있다.

user$ pyenv shell my-virtual-env-2.7.8  
pyenv-virtualenv: activate my-virtual-env-2.7.8

(my-virtual-env-2.7.8) user$ 

생성한 개발 환경은 pyenv shell 명령어로 사용할 수 있다. 실제로 여기서부터는 완전히 독립된 개발 환경이므로 새롭게 pip install djangopip install flask 등과 같이 파이썬 패키지를 독립적으로 설치할 수 있다.

user$ pyenv activate  
(my-virtual-env-2.7.8) user$

(my-virtual-env-2.7.8) user$ pyenv deactivate
user$  

만약 ~/.bash_profile이나 ~/.zshrceval "$(pyenv virtualenv-init -)”을 추가하지 않았다면 자동으로 activate 되지 않을 것이다. 그럴때는 수동으로 pyenv activate를 통해서 가상 환경으로 사용할 수 있다. 반대로 호스트로 나가고 싶은 경우에는 pyenv deactivate 명령어로 나갈 수 있다. 하지만 왠만하면 ~/.bash_profile로 자동으로 activate되게 해두자.

파이썬 패키지 팀 프로젝트 개발환경 구축하기

사실 팀 프로젝트를 진행하게 되면 파이썬 패키지 버전이 모두 같아야하지 않을까? 레일즈에서는 프로젝트별로 Gemfile 이라는 파일이 있어 사용하는 라이브러리나 모듈 ( 일반적으로 레일즈에서는 Gem이라고 부른다. ) 을 공유하고 모두 같은 환경으로 사용할 수 있다.

파이썬 djangoflask에서는 자체적으로 이 문제를 해결하는 기능은 없는 것 같다. 하지만 아래의 방법을 통해서 공유하고 똑같은 개발환경을 구축할 수 있다.

처음으로 프로젝트를 생성하고 개발환경을 구축한 사람이 다음의 명령어를 통해서 requirements.txt를 정의한다 :

user$ pip list > requirements.txt  

다른 개발자들은 requirements.txt 파일을 통해서 파이썬 패키지들을 설치하고 사용한다 :

other-user$ pip install -r requirements.txt  

autoenv를 통한 자동화

본 내용은 Github > kennethreitz > autoenv를 기반으로 작성되었습니다. 더 자세한 내용은 위의 링크에서 확인하실 수 있습니다.

autoenv 설치하기

user$ brew install autoenv  

매 세션마다 autoenv를 자동으로 실행하기

user$ echo 'source /usr/local/opt/autoenv/activate.sh' >> ~/.bash_profile  

이렇게 하는 이유는 터미널에서 새로운 세션이 실행될 때 마다 activate.sh 파일을 실행시키는데 목적이 있다. 사실 autoenv는 대단한 프로그램은 아니다. 그냥 터미널에서 디렉토리가 변경될 때 마다, 폴더 안에 있는 .env 파일을 찾는 스크립트다. 그렇게 복잡한 스크립트는 아니므로 직접 읽어보는 것도 좋은 공부가 될 것 같다. ( Github > autoenv > activate.sh)

autoenv 사용하기

$ touch project/.env
$ echo "echo ‘hello world'" > project/.env
$ cd project
hello world  

사실 사용법 자체는 굉장히 쉽다. 프로젝트 폴더 내부에 .env 파일을 생성하고 안에다 실행시키고픈 스크립트를 넣어두면 된다. 실제로 위에서 설치하고 사용한 pyenvpyenv-virtualenv를 활용한다면 다음과 같이 활용할 수 있다.

# ~/my_django_project/.env

echo “***********************************”  
echo “Python Virtual Env > Django with Python 2.7.8”  
echo “***********************************”

pyenv shell my-virtual-env-2.7.8  
pyenv activate  
user$ cd ~/my_django_project/

***********************************
Python Virtual Env > Django with Python 2.7.8  
***********************************

(my-virtual-env-2.7.8) user$

정리

파이썬 개발 환경을 설정하는 방법을 알아보았다. pyenv를 이용해서 파이썬 버전을 관리할 수 있게 되었다. 여기서 파이썬 패키지들을 관리하고 독립된 파이썬 개발 환경을 만들기 위해서 pyenv-virtualenv를 활용하였다. 그리고 프로젝트별로 가상 환경으로의 접속을 자동화하기 위해서 autoenv를 활용하였다.

개인적으로는 정말 재미있는 내용이였다. 워낙 내 관심분야가 자동화 ( 테스트 자동화, 개발환경 자동화 등 )이기도 하고 구축하는 과정 내내 배울 점이 너무 많았다. 앞으로의 개발이 매우 기대되는 하루다.

안수찬 @dobestan

안수찬 @dobestan

https://ansuchan.com/

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com

View Comments...