# 나의 파이썬 환경 (2020년판)

# 1. 나의 요구사항

파이썬을 처음 배울 때, 그리고 어느 정도 익숙해졌다고 생각했을 때 가상환경에 대한 고민을 한번씩 크게 했었습니다. 벌써 3년 이상 매일같이 사용하는 파이썬이다보니 이제 제법 노하우가 쌓여서 앞으로 어떻게 사용할지 정리해보는 시간을 가질겸 이 글을 쓰게 되었습니다. 비슷한 고민을 가지신 분들께서도 이 글을 통해 각자 자신의 환경에 맞는 실용적이고 강력한 환경을 갖추시길 기대합니다.

저는 데이터 엔지니어로서 여러가지 빅 데이터 분석 도구를 사용하고 있습니다. 빅 데이터 분석 도구는 자바 또는 스칼라로 개발된 것이 많지만 (대표적으로 하둡), 자동화와 연결된 부분은 파이썬과 연동해서 사용하는 것이 일반적이라고 생각합니다. 파이썬과 관련된 저의 작업 환경과 요구사항은 아래와 같습니다.

  • 개발 OS는 맥 OS X, 배포 환경은 리눅스 (Cent OS)
  • 파이썬 버전은 3.5, 3.6, 3.7을 사용하고 있고 앞으로 만들 제품은 3.7과 3.8 중심일 것으로 생각한다
  • 빅 데이터 분석 자동화 (에어플로우와 하둡 에코시스템)
  • API 서버 개발 & 배포
  • Library 개발 & 배포

조금 더 자세히 들여다보면 개발과 분석 그리고 운영 환경의 세 그룹으로 나눠볼 수 있습니다.

# 1.1 개발환경의 요구사항

  • 맥 OS X
  • 다양한 파이썬 버전 지원 (v3.5 ~ v3.8)
  • 특정 제품 개발을 위한 가상환경
  • 패키지 의존성 관리

# 1.2 빅 데이터 분석 환경

  • 판다스(pandas), 넘파이(numpy) 등 수치 계산 라이브러리
  • 하이브(hive), 스파크(spark, pyspark), 프레스토(presto) 등 빅데이터 처리 도구
  • 에어플로우 (Airflow) 같은 배치 환경

# 1.3 서비스 운영/배포 환경

  • API 서버 (ex. Flask)
  • 물리머신, 가상머신, 도커, 쿠버네티스
  • 설치 가능한 파이썬 패키지

# 2. 나의 파이썬 솔루션

목적에 맞는 프로젝트 개발을 하기 위해서 각각의 독립된 개발 환경이 필요합니다. 그러기 위해 venv, virtualenv, conda, pipenv 등 다양한 도구들을 사용해봤습니다. 하지만, 파이썬에 익숙하지 않아서 무턱대고 남이 좋다고 해서 사용해 본 툴들과 많은 시행착오를 거치면서 드디어 나에게 맞는 툴들을 선택할 수 있게 되었습니다.

# 2.1 pyenv

파이썬은 빠르게 변화하는 언어입니다. 특히 최근에 더욱 높아진 인기로 인해 빠른 속도로 굵직굵직한 기능이 추가되고 있습니다. 그로인해 개발장비에 여러 버전의 파이썬을 설치하고 필요할 때 마다 바꿔서 사용하는 일이 잦아졌습니다. 하지만, 파이썬 버전을 관리하는 일은 쉽지 않은 일입니다. 처음에는 무조건 시스템 파이썬을 업그레이드 했다가, 예전 프로그램을 실행하지 못하는 일이 있었고, 원하는 버전의 파이썬 바이너리를 다운받아서 각 제품에 맞는 환경변수를 바꿔가며 구성하는 노력(아마도 삽질)도 했었습니다.

하지만 pyenv (opens new window) 를 이용하면 별다른 노력없이 깔끔하게 버전 관리를 해낼 수 있습니다. 맥 OS X에서의 설치는 brew install pyenv 명령만으로 충분하지만, Basic GitHub Checkout (opens new window) 방법으로 설치하는 것도 전혀 어렵지 않습니다.

$ pyenv versions
  system
* 3.7.5 (set by /Users/kyryu/.pyenv/version)

$ pyenv install --list
Available versions:
  2.1.3
  ...
  3.7.5
  3.7.5rc1
  3.8.0
  3.8-dev
  ...
$ pyenv install 3.8.0
  python-build: use [email protected] from homebrew
  python-build: use readline from homebrew
  Downloading Python-3.8.0.tar.xz...
  -> https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz

# 2.2 poetry

poetrynodejsnpm 스타일로 파이썬 프로젝트를 관리합니다. 모든 의존성을 디렉토리 중심으로 관리하고 설치환경과 개발환경을 별도로 관리하기 편리합니다. 비슷한 개념의 pipenv 도 사용해봤는데, 의외로 장점이라고 생각했던 의존성 관리 부분에 실망해서 더 이상 사용하지 않습니다. 오픈소스의 특징이자 단점이라고 할 수 있는데, 주요 메인테이너가 이슈를 적절한 타이밍에 대응하지 않으면 처음에 열광했던 사용자들은 쉽게 떠나버리리고 맙니다. poetry 는 지금까지는 기능도 뛰어나고 잘 관리되고 있기 때문에 많은 개발자들로부터 지지를 얻고 있습니다.

conda 도 개발환경용으로 오랫동안 사용했지만, 결국 깨끗하게 지웠습니다. 이유는 단순한데 conda install 명령만으로 설치되지 않는 패키지가 있어서 설치방법을 찾느라 시간을 낭비하거나 conda 명령으로 설치한걸 모르고 pip 로 중복 패키지 설치를 하거나 하는 문제가 빈번하게 발생했기 때문입니다. 경우에 따라 pip 를 사용해야 한다는 점에 저에겐 매력을 잃고 말았습니다. 본질적이지 않은 문제에 신경쓰고 싶지 않아서였습니다. 또한, 꼭 conda가 필요한 상황이라면 위의 pyenv 를 통해서 conda 도 쉽게 설치할 수 있기 때문에 아쉽지 않습니다.

# 2.3 pip-tools

패키지의 의존 패키지들을 설치하는 가장 널리 알려진 방법은 pip install -f requirements.txt 입니다. 많은 프로젝트들이 이 방법을 사용하고 있죠. 저는 더이상 새로운 프로젝트를 만들 때 이 방법을 사용하지 않지만, 한 가지 예외가 있습니다. 바로 컨테이너 도커 docker 환경입니다.

docker 환경에서는 단일 파이썬 환경일 확률이 높으므로, 가상환경을 만드는 것이 오히려 낭비라고 생각되었습다. 하지만 이미 poetrypipenv 가 제공하는 높은 수준의 패키지 관리를 놓치고 싶지 않았습니다. 그럴 때 알게된 것이 pip-tools 입니다.

pip-toolspip-compile 이라는 명령을 가지고 있습니다. 이 명령을 이용하면 정확한 패키지 버전을 가리키는 해시(hash) 값을 포함해서 requirements.txt 에 만들어줍니다. 단순히 패키지명 혹은 패키지의 버전만 표시하는 것에 비해 훨씬 정확하고 재현 가능한 환경을 언제든지 만들수 있다는 장점이 있다.

# requirements.in
pendulum
requests
redis
# Dockerfile
RUN pip install -U pip pip-tools && \
 pip-compile --generate-hashes --output-file requirements.txt requirements.in && \
 pip install --require-hashes -r requirements.txt

# 3. 그 밖의 요소들

# 3.1 정적 타입 검사

많은 시간 C++ 을 사용했기 때문에 파이썬 같은 동적 타입 언어에 익숙해지는게 너무 어려웠던 기억이 난다. 파이썬에선 이제 3.7 버전부터 본격적으로 타입 힌팅 (type hinting)을 지원합니다. 하지만! 실행시점에 타입을 확인하는 오버헤드를 피하기 위해서 정적 타입 검사 를 실행합니다. 한마디로 실행할 때는 타입에 관한 모든 것이 무시 됩니다.

이런 정적 타입검사 도구는 mypy 가 가장 유명하지만 최근엔 black 이 많이 사용되며 페이스북에서 만든 pyre 도 많은 관심을 받고 있습니다. 활용을 강제하기 위해 CI/CD 파이프라인에 꼭 넣고 활용하려고 합니다.

# 3.2 virtualenvwrapper

사실 개인적으로 가장 오래 사용한 가상환경 툴은 virtualenvwrapper 입니다. 배포/운영 환경에서 편리하게 사용하고 있습니다. 당분간 바꿀 필요는 못느끼지만 파이썬 버전 관리에 대해서는 앞으로 pyenv 와 함께 사용하거나 poetry 로 넘어갈지도 모르겠습니다.

# 3.3 vscode

편집기는 vscode를 계속 사용하고 있습니다. MS의 업데이트도 눈부시게 빠르고, Pycharm 을 안써봐서 딱히 전용 IDE의 필요성도 느끼지 못하고 있습니다.

# 4. 맺음말

파이썬이 빠르게 성장하는 만큼 주변 툴체인(toolchain)도 많이 발전하고 있습니다. 과연 이 선택이 1년을 버틸 수 있는지 내년에 한번 확인해보겠습니다!

Last Updated: 3/23/2020, 11:10:33 PM