다시 만난 콘다 (conda)

1. 왜 콘다(conda)를 다시 설치하나?

파이선 가상환경이나 패키지 관리의 중요성을 모를 때 콘다를 접해서 잘 사용하다가 파이선 운영에 익숙해지고, 자바스크립트(javascript) 패키지 관리자 npm 도 사용해보면서 최근 개인 환경은 pipenv 를 주로 사용하고 있습니다. 콘다는 바로 지웠었습니다 (과거형)

하지만, 가끔 콘다(conda)가 생각날 때가 있었으니 바로

  1. 문뜩 주피터 노트북 (jupyter notebook)을 쓰고 싶을 때와
  2. 콘다(conda) 기준으로 설명된 수많은 글들을 접할때 입니다. (Tensorflow 라든지 Tensorflow 라든지..)

특정 프로젝트를 만들기보다 경우에 따른 필수 패키지를 몇 개 미리 설치해놓고, 코드조각을 실행해보는 용도로 주피터 노트북을 사용하곤 했는데 완전히 프로젝트 기반으로 옮겨보니 불편함이 있습니다. 주피터 노트북이 콘다를 잘 지원하기 때문에 중간에 커널을 바꾸는 것도 용이하고요.

이번에 콘다를 다시 설치하면서 느낀 점을 정리해봤습니다. (이미 설치해서 사용 중이신 분이라도 아직 콘다가 손에 익숙치 않다면 4. 개념과 필수 명령어 사용법 만 참고하시는 것도 좋을 것 같습니다.)

2. 파이선 가상환경의 개념

파이선은 패키지 의존성 관리가 어렵습니다. 하지만 경험이 거의 없을 때는 그 사실을 알기 어렵습니다. 오히려 왜 virtualenv까지 알아야하는지 더 복잡해지는 설명으로 썩 달갑지 않았던 기억이 있습니다. 익숙치 않은 분들을 위해서 가상환경의 필요성을 후려쳐서 설명한다면

  1. 파이선으로 개발하다보면 파이선의 버전에 따라서 지원되는 문법과 패키지가 다르고
  2. 패키지들 사이의 의존성이 충돌할 때 해결하기 어렵기 때문에
  3. 파이선은 가상환경 이라는 개념으로 프로젝트 단위로 모든 의존 관계를 제한하는 아이디어를 내놨으며
  4. 제한하는 구체적인 방법은 특정 디렉토리를 지정해서 하나의 프로젝트에서 필요한 모든 실행파일과 라이브러리를 넣어놓고
  5. 각종 필수 환경변수를 그 디렉토리를 가르키도록 합니다

이 때, 어떤 가상환경 관리자를 사용하는지에 따라서 그 디렉토리의 위치 가 프로젝트 디렉토리와 같거나 혹은 중앙관리 하는 차이가 있을 뿐 기본 개념은 크게 다르지 않습니다.

기본은 의존성있는 모든 패키지 (바이너리, 라이브러리)를 하나의 디렉토리에 모아서 관리하는 것입니다. 새로운 프로젝트를 시작한다면 혹은 다른 환경 (예를들어 배포 환경)에서도 개발 환경과 동일한 환경이라는 것을 보장하고 싶다면 파이선 가상환경을 사용하세요.

3. 빠르게 돌려보기

3.1 파이선과 미니콘다 설치

우선 파이선을 설치하세요. 아래 링크로 들어가서 2.7 버전과 3.6 버전을 설치합니다.

2.x 버전은 이제 곧 공식 지원이 끝나므로 3.6 버전을 사용하면 충분해야겠지만, 아직도 많은 프로젝트가 2.x 에서만 동작하는 것이 현실입니다.

콘다의 설치는 공식 문서를 따라서 각자 운영체제에 맞게 합니다. https://conda.io/docs/user-guide/install/index.html

운영체제 이외에 선택할 것은 미니콘다(miniconda)를 선택할지 아나콘다(anaconda)를 선택할지 입니다. 이전 포스트 에서는 선택의 기준에 대해서 설명했지만, 지금이라면 그냥 미니콘다를 설치하라고 권해드리겠습니다.

  • 미니콘다가 훨씬 적은 공간을 차지합니다. 미니콘다 400MB, 아나콘다 3 GB
  • 아나콘다는 데이터 분석 패키지부터 웹 패키지까지 너무 많이 역할이 중복되게 설치합니다.

가볍게 미니콘다를 설치하고 필요한 패키지는 추가 설치하세요.

3.2 설치 확인

설치하고 conda list 명령으로 설치된 패키지를 확인해봅시다. 혹시 conda 명령을 찾지 못하나요? conda 명령이 설치된 PATH를 찾지 못했기 때문입니다. 콘다 설치파일이 PATH$HOME/.bash_profile 파일에 추가되기 때문에 배시(bash) 쉘을 사용한다면 source $HOME/.bash_profile 명령을 수행하면 conda 명령을 사용할 수 있고, 저처럼 zsh 을 사용하시는 분은 .zshrc 파일 마지막에 아래 내용을 적은 후 source .zshrc 명령을 실행합니다.

$ tail -n 1 $HOME/.bash_profile
export PATH="$HOME/miniconda3/bin:$PATH"
$ source $HOME/.bash_profile

이제 conda list 명령을 하면 설치된 패키지 목록을 볼 수 있습니다.

$ conda list
# packages in environment at /Users/kyryu/miniconda3:
#
# Name                    Version                   Build  Channel
asn1crypto                0.24.0                   py36_0
ca-certificates           2018.03.07                    0
certifi                   2018.4.16                py36_0
...
xz                        5.2.4                h1de35cc_4
yaml                      0.1.7                hc338f04_2
zlib                      1.2.11               hf3cbc9b_2

3.3 가상환경 만들기

콘다를 설치한 직후에는 기본(base) 환경만 있습니다.

$ conda env list
# conda environments:
#
base                  *  /Users/kyryu/miniconda3

플라스크(flask) 웹 프레임워크를 위한 가상환경을 만들어봅시다. 우선, 새로운 가상환경을 만듭니다.

$ conda create -n hello
Solving environment: done

## Package Plan ##

  environment location: /Users/kyryu/miniconda3/envs/hello


Proceed ([y]/n)? y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use:
# > source activate hello
#
# To deactivate an active environment, use:
# > source deactivate
#

가상환경이 만들어지고 주석으로 새로 만들어진 가상환경으로 들어가는 방법을 설명합니다. source activate hello 로 가상환경으로 들어가고 source deactivate으로 가상환경에서 빠져나옵니다. 가상환경으로 들어가면 * 표시가 hello 로 이동한 것을 확인할 수 있습니다.

$ source activate hello
(hello) $ conda env list
# conda environments:
#
base                     /Users/kyryu/miniconda3
hello                 *  /Users/kyryu/miniconda3/envs/hello

프롬프트 앞에 가상환경 이름이 표시된 것을 확인할 수 있습니다. 이제 플라스크를 설치하고, 간단하게 플라스크 버전을 확인합니다.

(hello) $ conda install -y flask
...
(hello) $ python -c "import flask; print(flask.__version__)"
1.0.2

정상적으로 설치되었네요. 이제 아래 내용을 app.py 라는 이름으로 저장합니다.

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

이제 python app.py 명령으로 새로운 플라스크 앱이 동작하는 것을 확인하세요.

(hello) $ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

브라우저에서 http://127.0.0.1:5000/ 주소로 들어가면 Hello World!를 확인하실 수 있습니다.

작업이 끝나면 source deactivate로 가상환경에서 빠져나옵니다.

(hello) $ source deactivate
$ conda env list
# conda environments:
#
base                  *  /Users/kyryu/miniconda3
hello                    /Users/kyryu/miniconda3/envs/hello
$
$ python -c "import flask; print(flask.__version__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'flask'

가상환경을 빠져나온 다음에는 플라스크를 사용할 수 없는 것을 알 수 있습니다. 이것으로 가상환경을 만들고 원하는 패키지를 설치를 다른 환경과 독립적으로 설치하고 사용하는 방법을 알아봤습니다.

4. 개념과 필수 명령어 사용법

필요한 핵심은 대부분 배웠습니다. 하지만 기본 개념과 함께 더 쉽게 콘다를 이용하는 방법을 알아봅시다.

콘다는 사용자 입장에서 두 가지 개념만 알면 충분합니다.

  • 가상환경
  • 파이선 패키지

개인적으로 콘다 명령은 설계가 맘에들진 않습니다. 위의 두 개념에 대해서 세 개의 동사만 기억하면 95%의 상황에서 충분합니다.

가상환경 명령은 conda env 로 시작하고 동사를 붙인다. 동사는

  • list: 가상환경 목록
  • create -n "가상환경 이름": 새로운 가상환경 생성.
    • -n "가상환경 이름" 이 꼭 필요하고,
    • 특정 파이선 버전이 필요하면 python=python2 또는 python=python3 같은 형식으로 지정한다.
  • remove: 가상환경을 지운다

파이선 패키지 명령은 현재 가상환경의 패키지를 관리한다. conda로 시작하고 동사를 붙인다. 동사는

  • list: 설치된 패키지 목록
  • install "패키지 이름": 패키지를 설치한다.
    • conda에 등록되어있지 않아서 설치할 수 없는 패키지도 있다.
    • 그럴 땐 pip install로 설치하면 된다.
  • uninstall "패키지 이름": 패키지를 지운다.

5. 결론

콘다는 아쉬운 점도 많지만, 기업에서 관리하는 프로젝트이기 때문에 기술문서도 풍부하고 다른 핫한 프로젝트들과 연동도 잘 되는 편입니다. 너무 어렵지 않게 편하게 활용하시는데 도움이 되었길 바랍니다.