[Python] 파이썬 실행환경의 독립 virtualenv & PyCharm Develop Tip

그동안 python 개발을 하면서 deployment 에는 그렇게 많이 신경을 쓰지 않았었습니다.
하지만 결국은 virtualenv 의 필요성을 아주 절감하고는 이렇게 정리를 해 봅니다.

예를 들어 개발 소스 (패키지)는

A
|
+-- B
|
+-- C

아래와 같은 식으로 되어 있다고 가정하고,

A.B 패키지를 돌리는 파이썬 패키지 등의 개발 환경과 
A.C의 개발 환경이 다를 때, 필요에 따라 개별적으로 
쉘 스크립트를 작성하여 필요 패키지를 apt-get install python-xxx 와 같이 설치하거나
아니면 pip install xxx 로 설치를 하였습니다.

그렇게 하다보면, 나중에 개발 환경의 서버는 온갖 Third-party 모듈들로 가득차서
실제 운영환경과는 엄청 다른 결과를 야기하고, 또한 각 모듈별 버전 차이에 따른
문제가 발생할 수 있습니다.

실은 이런 문제는 윈도우의 DLL 버전 차이 문제나,
Linux의 shared library 등의 동적 라이브러리 등에서도 같이 나타나는 문제이고
이런 문제를 해결하기 위해서 별도의 패키징 (데비안, 우분투에서의 aptitude,apt-get;
Redhat,페도라,CentOS 등의 rpm, yum; 또는 특이하게 이런 디펜던시 문제를
가장 줄일 수 있지만 가장 빌드시간이 많이 드는 Gentoo 리눅스와 같이
emerge를 이용한 소스 빌드 방법도 있습니다) 시스템이 이런 디펜던시 문제를 
해결하려고 하고 있지요. (그럼에도 불구하고 사용자가 다른 버전의
라이브러리 등을 개별 설치해서 발생할 수 있는 문제는 여전히 존재합니다)

물론 Java나 DotNetFramework와 같은 Sandbox 라고 해서 문제가 없는 것은 아닙니다.
이런 VM은 또 자체 버전에 따라 문제가 발생할 수 있고,
시스템에 역시 개별 VM을 버전에 따라 지정할 필요도 있지요.

파이썬도 마찬가지 입니다.
실제 개발 당시의 라이브러리, 모듈 등의 환경과,
차후 몇년간 운영될 환경이 서로 같지 않아서 발생하는 온갖 문제에
시달리고 싶지 않다면 virtualenv로 환경을 갖추고
필요에 따라 App 별, 혹은 버전별 별도의 운영 환경으로 작업을 하는 것이 필요합니다.

이런 것을 염두에 두고 알아낸 사실을 공유해 볼까 합니다.

일단 VirtualEnv를 사용하기 위해서는 PIP 라는 (pypi.python.org) 라는 별도의
파이썬 패키지 관리자를 이용하는 것이 제일 좋습니다.

우분투 12.04에서 작업한다고 할때, PIP 및 virtualenv를 설치하는 가장 좋은 방법입니다.

쉘 스크립트에 다음을 추가하여 실행합니다.
##########################################################################################
#
# Python module installation by pip and virtualenv
#
##########################################################################################
pip list
if [ $? -ne 0 ];then
    sudo apt-get -y install python-pip
    sudo pip install --upgrade pip
    sudo ln -s /usr/local/bin/pip /usr/bin/pip
    sudo pip install -U distribute
    sudo pip uninstall virtualenv
    sudo pip install virtualenv
    sudo pip install sfood  # only for finding python module dependency
fi

우분투 12.04에서 설치되는 python-pip는 pip list 명령이 없는 구 버전이기 때문에 위와 같이 pip list
명령으로 체크를 하였습니다.

이제 virtualenv 로 작업을 하는 것을 간단히 보면,

$ virtualenv myApp

명령을 내리면 myApp 라는 폴더와 함께 그 안에 모든 virtualenv 환경에 필요한 Python 인터프리터 부터
시작하여 관련 작업을 들어가게 되는 환경(폴더)이 만들어 집니다.

또한 해당 가상환경을 이용하기 위하여
$ source myApp/bin/activator
라는 명령을 수행해 줍니다.

그러면 (myApp) 라는 내용이 쉘 프람프트에 추가되어 보입니다.

(myApp) $ 

여기서 pip로 설치를 하나 해 보면,

(myApp) $ pip install psutil

와 같은 식으로 설치를 할 수 있고, 이것은 myApp/lib/python2.7/site-packages
안에 설치가 됩니다.
만약 위와 같은 virtualenv 환경이 아니었다면,
$ sudo pip install psutil
과 같이 sudo를 이용하여 /usr/local/lib/python2.7/dist-packages (혹은 site-packages) 와 같은
시스템 폴더에 넣어야 합니다. (모든 파이썬 App에 공통적인 것이 아니라면
이와 같은 시스템 설치는 자제하는 것이 좋습니다)

가상환경에서 해당 패키지를 개발하는 동안 여러개를 설치했고,
이를 살펴보면,

(myApp) $ pip list
argparse (1.2.1)
pexpect (3.0)
pip (1.4.1)
psutil (1.2.1)
pymongo (2.6.3)
setuptools (1.1.5)
wsgiref (0.1.2)

와 같이 나옵니다.

그런데 이 환경을 쉽게 스냅샷처럼 가지고 있다가 (꼼짝마 freeze 라는 명령이 있습니다)
차후에 다른 곳에서 쉽게 다시 해당 모듈을 설치할 수 있습니다.

(myApp) $ pip freeze > myApp.req

위와 같이 하면 위에 list 했던 결과가 myApp.req 라는 파일에 저장됩니다.

그리고 다른 호스트 혹은, 가상환경에서

(anotherApp) $ pip install -r myApp.req

와 같은 식으로 해당 환경을 갖출 수 있습니다.


다음은 PyCharm 이라는 JetBrarins 사의 파이썬 전용 IDE를 사용하는바,
PyCharm을 이용한 VirtualEnv 와의 연동도 살펴보겠습니다.

위와 같이 PyCharm의 Settings 에서 파이썬 인터프리터 지정하는 곳에 우측 "+","-" 아래 아래에 있는 Create Virtual Environment 툴을 누릅니다.

그러면 위와 같이 나타나고 해당 위치와 어느 파이썬 인터프리터에서 가져오겠는가를 지정하면,

새로운 가상환경이 만들어 집니다. 이제부터는 해당 가상환경으로 작업을 할 수 있습니다.

또한 기존에 만들어진 가상환경도 가져올 수 있습니다.

위와 같이 Local을 선택하고 (Remote 를 눌러 원격 디버깅도 가능한데, 원격에서의 VirtualEnv 연결은 아직 해결 못하였습니다)

이미 만들어진 가상환경의 bin/python을 선택하면,

위와 같이 Add virtualenv 대화창이 나타나고, OK를 눌러 

위와 같이 나타나는 것을 알 수 있습니다.

또한 현재 가상환경의 설치된 패키지 목록이 하단에 "Packages" 목록에 나타납니다.

외부의 터미널에서 가상환경에 들어가서 (위의 source myApp/bin/activator 명령)
pip install 을 하듯이, 동일한 작업을 위 화면의 중앙 우측의 "Install"을 눌러봅니다.

그럼 위와 같이 패키지 목록이 나옵니다. (하단의 Manage Repository 단추를 이용하여 저장소도 추가할 수 있군요.)

여기에서,

상단에 psutil 을 검색하고 하단 "Install Package" 를 눌러 설치를...

하려고 하였으나, python-dev 패키지가 설치되어 있지 않아 오류가 발생하였습니다.
(psutil 이라는 모듈처럼 종종 c 컴파일을 하여 파이썬 모듈로 붙이는 경우도 많습니다)

$sudo apt-get install python-dev
패키지를 설치하는 오류가 발생하면, 다음을 참고합니다.

재 설치를 하여 정상 설치된 것을 확인 할 수 있습니다.

그런데 만약,

위와같이 외부 터미널의 동일 가상환경에서 다른 모듈을 설치하였다면,

위와 같이 우측 깔때기 모양의 단추를 눌러 현재 모듈의 추가된 것이 있는지 업데이트 할 수 있습니다.

이로써 파이썬의 가상환경을 살펴보았습니다.
이를 잘 활용하여 개발환경의 복잡도 및 배포의 문제점 등을 미리 미리 예방하는데
활용할 수 있습니다.


어느분께는 도움이 되셨기를...

핑백

덧글

  • 감사감사 2015/11/10 19:19 # 삭제 답글

    정말 감사합니다.
  • 지훈현서아빠 2015/11/11 09:29 #

    도움이 되셨다니 저의 보람입니다~~ ^^
  • 태로군 2015/12/04 00:18 # 삭제 답글

    감사합니다~ ^^ 매번 파이썬에 대해 모르는것이 있어 해메일때 한줄기 빛이 되어 주시는군요~
  • 지훈현서아빠 2015/12/04 09:27 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트