파이선 가상환경 환경변수 설정

가상환경에서 상황에 맞는 각자의 환경변수를 설정할 필요가 있습니다. 이번 글에서는 콘다와 virtualenv의 기능을 이용해서 환경을 변경할 때마다 필요한 환경변수를 설정하거나 설정 취소하는 방법을 알아봅니다.

1. 배경

이전 글 파이선 가상환경 콘다 시작하기에서는 파이선 버전에 따른 가상환경을 설정하는 방법을 알아봤습니다. 예를들어 저는 airflow라는 워크플로우 엔진을 사용하고 있습니다. 대부분 서비스처럼 위크플로우 엔진도 개발용과 서비스용으로 나눠서 제공합니다. 환경 변경할 때 함께 변경되어야 하는 환경변수를 다루는 방법을 알아봅니다.

2. 준비

2.1 airflow-staging 환경 만들기

airflow-staging 환경을 만듭니다.

$ conda create -n airflow-staging python=2.7
(airflow-staging) $ pip install -y airflow

airflow 홈 디렉토리를 설정하고 필요한 패키지를 설치합니다.

$ export AIRFLOW_HOME=~/airflow-staging
$ mkdir $AIRFLOW_HOME
$ pip install mysql-python

airflow의 설정파일은 $AIRFLOW_HOME/airflow.cfg 입니다. 처음 airflow 명령을 실행하면, $AIRFLOW_HOME 에 해당 파일이 생성됩니다.

(airflow-staging) ~/airflow-staging $ airflow
[2017-04-21 13:20:51,070] {__init__.py:57} INFO - Using executor SequentialExecutor
usage: airflow [-h]
               {resetdb,render,variables,connections,pause,task_failed_deps,version,trigger_dag,initdb,test,unpause,dag_state,run,list_tasks,backfill,list_dags,kerberos,worker,webserver,flower,scheduler,task_state,pool,serve_logs,clear,upgradedb}
               ...
airflow: error: too few arguments
(airflow-staging) ~/airflow-staging $ ls
airflow.cfg   unittests.cfg

airflow.cfg 파일에서 [core]airflow_home, dags_folder, base_log_folder 항목의 값이 $AIRFLOW_HOME을 기준으로 설정된 것을 확인할 수 있습니다.

여기까지만 진행하고 airflow-develop 환경을 만들겠습니다. 이후 설치 방법은 다음 글에서 참고하시기 바랍니다.

2.2 환경변수 설정/제거 하기

이제 본론입니다. 환경을 시작할 때 원하는 환경변수를 설정하고, 환경을 나올 때 환경변수를 제거하는 방법을 알아보겠습니다.

콘다가 현재 환경을 관리하는 홈 디렉토리로 이동합니다.

cd $CONDA_PREFIX

여기서 /etc/conda/activate.d 디렉토리를 만들면, 콘다는 이 디렉토리에 들어있는 모든 .sh 스크립트들을 환경이 활성화 될 때 같이 실행합니다.

mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/env_vars.sh
touch ./etc/conda/deactivate.d/env_vars.sh

이제 activate.d/env_vars.sh 파일을 열고 아래와 같이 설정합니다.

#!/bin/bash

export AIRFLOW_HOME=~/airflow-staging

deactivate.d/env_vars.sh 파일은 아래와 같이 unset 합니다.

#!/bin/bash

unset AIRFLOW_HOME

완성했습니다. 확인해보겠습니다.

$ source deactivate
$ echo $AIRFLOW_HOME

$ source activate airflow-staging
(airflow-staging) $ echo $AIRFLOW_HOME
/Users/$USER/airflow-staging

2.3 airflow-develop 환경 만들기

이제 airflow-develop 환경을 만들겠습니다. 세 가지 방법이 있습니다.

  1. 위와 동일하게, 하지만 이름만 airflow-develop으로 반복해서 수행
  2. conda env export로 환경을 export, conda env create -f environment.yml 로 환경 import
  3. conda create clone으로 환경 복제

1번은 재미없고, 2번은 이전 블로그 글에서 설명했으니 이번에는 3번을 해보겠습니다.

$ conda create --name airflow-develop --clone airflow-staging
Source:      /Users/jp21227/miniconda3/envs/airflow-staging
Destination: /Users/jp21227/miniconda3/envs/airflow-develop
Packages: 9
Files: 7710
#
# To activate this environment, use:
# > source activate airflow-develop
#
# To deactivate this environment, use:
# > source deactivate airflow-develop
#

새로 만든 airflow-develop 환경에 들어가보니, 환경변수 설정도 함께 복제된 것을 확인할 수 있습니다.

$ source activate airflow-develop
(airflow-develop) $ echo $AIRFLOW_HOME
/Users/$USER/airflow-staging

새로 만든 환경을 위한 AIRFLOW_HOME을 다시 개발환경에 맞게 설정합니다. etc/conda/activate.d/env_vars.sh을 새로운 디렉토리에 맞게 설정하고 환경을 빠져나왔다 다시 진입합니다.

(airflow-develop) $ cd $CONDA_PREFIX
(airflow-develop) $ cat etc/conda/activate.d/env_vars.sh
#!/bin/sh

export AIRFLOW_HOME=~/airflow-develop

(airflow-develop) $ source deactivate
$ source activate airflow-develop
(airflow-develop) $ echo $AIRFLOW_HOME
/Users/jp21227/airflow-develop

unset 은 동일하니 deactivate 스크립트는 변경할 필요 없습니다.

이것으로 콘다 가상환경에서 환경에 맞는 환경변수를 설정하는 방법을 모두 알아봤습니다.

3. virtualenv 라면?

virtualenv 도 콘다와 매우 유사합니다. $VIRTUAL_ENV/bin/postactivate 파일과 $VIRTUAL_ENV/bin/predeactivate 파일을 이용합니다.

설정은 postactivate에서

$ $VIRTUAL_ENV/bin/postactivate
#!/bin/bash

export AIRFLOW_HOME=~/airflow-staging

환경변수 제거는 $VIRTUAL_ENV/bin/predeactivate 파일에서

#!/bin/bash

unset AIRFLOW_HOME

기본 개념과 동작방식은 virtualenv와 콘다가 동일하다고 생각하시면 됩니다.

4. 결론

파이선은 참 까다로운 언어입니다. 실제 서비스에서 사용하기에는 의존성 때문에 발생하는 문제가 너무 많습니다. 하지만 이것은 역설적으로 매우 많은 개발자들이 파이선을 사랑하기 때문에 발생하는 일일 것입니다. 언젠가 파이선을 능숙하게 사용할 날을 기대하며 글을 마칩니다.