[Python] pip와 가상환경 - 01

[Python] pip와 가상환경 - 01

들어가며

처음으로 파이썬을 기반으로 서비스를 개발한다면 반드시 넘어야할 산중 하나로 파이썬 패키징 생태계를 이해하는 것이다. 이를 위해서 이번 포스팅에서 pip와 virtualenv에 대해서 정리하고자 한다.

1. PIP

pip는 Python Package Index (PyPI) 저장소로부터 파이썬 패키지를 받아 설치하는 패키지 관리 도구이며 PyPI는 third-party 파이썬 오픈소스 패키지들을 위한 저장소이다. Node 진영의 NPM과 비슷하다고 생각하면 된다.

사실 Python은 훨씬 더 기초적인 패키지 매니저인 easy_install을 제공하고 있다. 처음 Python을 설치할 때 easy_install은 자동으로 설치된다. 하지만 여러 측면에서 easy_install보다 훨씬 더 우월한 pip를 사용하는것이 일반적이다.

예를 들어 pip를 사용해서 Flask를 설치하기 위해선 아래와 같은 명령어로 설치할 수 있다.

sudo pip install Flask

위의 방법으로 설치를 진행한다면 Flask는 시스템 전체에 설치가된다. 하지만 대부분의 경우 패키지를 글로벌하게 설치하지 않는다. 이제 그 이유를 알아보자

2. Virtualenv

virtualenv는 여러개의 파이썬 프로젝트가 하나의 컴퓨터에서 충동을 일으키지 않고 존재할 수 있도록 도와준다.

어떤 문제가 발생할까?

먼저 virtualenv가 존재하지 않는다고 가정해보자. 외부 웹 서버에 HTTP 요청을 보내는 파이썬 프로그램을 작성해야 하는 상황이다. 보통은 이를 위해서 Requests 라이브러리를 사용할 것이다. 따라서 pip 명령어를 이용해서 Requests 라이브러리를 설치해보자

pip install requests

이때 pip는 컴퓨터안에서 어느 곳에 패키지를 설치할까?? 설치를 하게 되면 아래와 같은 과정이 진행된다.

pip install requests Downloading/unpacking requests Downloading requests-1.0.0.tar.gz (337Kb): 337Kb downloaded Running setup.py egg_info for package requests Installing collected packages: requests Running setup.py install for requests error: could not create '/Library/Python/2.7/site-packages/requests': Permission denied

위의 로그를 통해 pip가 /Library/Python/2.7/site-packages/requests 경로에 패키지를 설치하려고 한 것을 알 수 있다. 이 폴더는 파이썬이 알고있는 특별한 폴더로 site-packages 내부에 패키지가 설치되면, 파이썬 프로그램에서 이 패키지를 임포트해서 사용할 수 있게된다.

하지만 위의 로그은 Permission denied 에러가 발생했다. 일반적으로 mac에서는 "일반 사용자"는 /Library 폴더에 쓰기 권한이 없기 때문에 위와 같은 에러가 발생한 것이다. 이를 해결하기 위해선 앞에 sudo를 붙여 관리자 권한으로 진행하면 된다.

이렇게 하면 패키지는 잘 설치될 것이고 이제 import하여 라이브러리를 사용할 수 있을 것이다. 이렇게 필요한 라이브러리를 사용하며 개발을 하다 점점 서비스 규모가 커졌고 더 이상은 모놀리틱 서비스로는 감당이 불가능해져 새로운 App으로 분리를 해야 하는 상황이며 신규 기능을 위해선 requests의 신규 기능이 필요해서 requests를 업그레이드 해야 한다고 가정해보자

sudo pip install --upgrade requests

이렇게 업그레이드를 하게되면 우리가 알게 모르게 심각한 문제가 발생할 위험에 노출된 것이다. 기존 서비스에서 사용되는 requests 라이브러리 또한 업그레이드가 되었기 때문에 기존의 코드가 더 이상 requests 라이브러리를 사용하지 못하는 상황이 벌어질 것이다.

물론 새로운 Requests API를 사용하도록 기존의 코드를 수정할 수도 있지만 기존의 프로그램을 변경해 문제를 해결하는 것은 더욱 치명적인 에러가 발생할 수 있는 지름길이며, 소요시간 또한 매우 많이든다. 그리고 프로젝트는 수십가지의 라이브러리를 의존하고 있는데 이 라이브러리들을 모두 최신버전으로 유지하고 모든 프로젝트를 동일한 버전의 라이브러리를 사용하도록 만드는 것은 최악의 선택이다.

3. virtualenv가 이 문제를 해결하는 원리

virtualenv는 각 프로그램별로 완전히 독립적인 가상의 환경을 만들어냄으로서 이 문제를 해결한다. 여기서 가상의 환경이란 파이썬 프로그램을 실행시키는데 필요한 모든 것을 가지고 있는 복사본 폴더를 의미한다.

기본적인 파이썬 스탠다드 라이브러리 복사본, pip설치 프로그램 복사본, 그리고 위에서 언급한 site-packages 복사본 등을 포합한다. 여러분이 virtualenv 도구를 이용해 생성된 pip 복사본을 이용해 PyPI로 부터 패키지를 설치하면, virtualenv 폴더 내부의 site-packages 폴더에 이를 설치한다. 그리고 설치된 패키지는 이전과 동일한 방법으로 파이썬 프로그램 내부에서 사용할 수 있다.

4. 마무리

이제까지 파이썬의 패키지 매니저인 PIP와 PIP를 사용해서 여러가지 외부모듈을 사용해야 할 때 왜 가상환경을 만들어서 사용해야 하는지 등에 대해서 알아보았다. 다음 포스팅에서는 이런 가상 환경을 셋팅하는 방법 그리고 좀 더 쉽게 가상환경을 셋팅하는 방법을 다루고자 한다.

Ref

from http://bloowhale.tistory.com/108 by ccl(A) rewrite - 2021-10-16 22:00:54