상세 컨텐츠

본문 제목

[Python 가상환경] conda 설치 및 가상환경 (feat. 내부 로직 & cheat sheet)

IT 이야기/IT 상식

by 리치윈드 - windFlex 2022. 9. 19. 21:54

본문

반응형

anaconda 가상환경에 대해서 알아보자. 원리도 함께.. conda create, conda remove, conda env list

Python을 사용하는 User들에게 ananconda (conda)는 매우 익숙한 패키지 관리자이다. 그러나, 익힐것이 많은 우리는 매번 conda 명령어가 가물가물하다. 또한, pip 명령어와, 명령어간 순서가 종종 혼동되기도 한다.

env 인가? envs 인가? 

오늘날, 이런 명령어 하나 하나를 모두 기억하고 살기에는 우리가 기억하고 있어야 할것이 너무 많다. 

또한, 종종 내부 로직을 이해하면 외우지 않아도 자연스럽게 암기가 되기도 한다. 내부 로직/원리를 함께 살펴 보자.

 

conda : 패키지 설치 / 버전

conda에서 가장 자주 사용하는 것은 당연히 패키지 설치 일것이다. 

$ conda install <package name1> <package name2> ...
ex)
$ conda install numpy pandas

conda install 화면

기존에 설치한 버전의 업데이트는 `update` 명령어를 사용한다. 

$ conda update pandas
[참조] 경우에 따라서는, `PackageNotInstalledError: Package is not installed in prefix.` 라는 에러가 발생하기도 한다. `conda list`를 실행하면 패키지가 설치되어 있는데, `update`에서 패키지를 인식을 못한다. 이것은 `pip`명령어로 설치한 패키지에서 발생한다. `conda install`로 설치한 패키지의 경우는 발생하지 않는다. 

 

 

가상환경 생성 : conda create

Python을 사용하면서, 다양한 Applicaiton을 개발하다보면 Python 버전 디펜던시, 패키지 버전관리 등을 필요로 하게 된다. 특히, ML 프로젝트를 하게 되면, Cuda/CuDNN과 python 버전에 따라서 구동 여부가 달라지기도 한다. 또한 Tensorflow/Pytorch가 동시에 설치되어 있는 경우 충돌이 나기도 한다.

 

$ conda create --name ML python=3.9
or
$ conda create -n ML python=3.9
[형태] conda create --name <가상환경 표시 이름> python=<버전>

 

매번 Python과 패키지를 다르게 설치할 수 없기 때문에, 가상환경을 사용하여 서로 독립적인 환경을 세팅해 준다. (좀 더 자세히 들여다 보면, Docker/Container의 전신과 유사한 형태로 동작하는 것을 알수 있다. Python 실행 파일을 특정 하위 디렉토리에 복사하고, root directory를 변경해 주는 형태를 사용한다. )
즉, `conda create` 과정은 특정 directory를 생성하고 버전에 맞는 python bin와 pip 등 기본 파일을 복사/설치하는 과정이다. 

이러한 과정을 이해하면 당연하게 내부 로직을 이해할 수 있는데, 기본적으로 가상환경(venv)마다 디렉토리가 정해져 있는 것을 알수 있다. 아래에서 거론될 Activate/Deactivate과정은 `change root dir` 과정이라고 볼 수 있다. 또한 신규로 설치되는 패키지들은 변경된 root dir 아래 새롭게 다시 설치되는 것이다. 

* docker의 전신인 Linux container 에서는 `chroot`를 활용하여 기준이 되는 root dir을 변경하였다. 

생성된 가상환경 리스트 확인

$ conda env list

 

conda env list 명령어를 사용하면 생성된 가상환경을 확인 할 수 있다. `conda env list` 명령어는 사실상 `ls ~/ananconda3/envs`와 동일한 역할을 한다고 생각할 수 있다. 

 

더보기

`conda env list`를 실행하면 가상환경 리스트를 확인할 수 있는데, 설치된 가상 환경의 directory 위치를 확인 할 수 있다. 

각 가상환경의 home 디렉터리에 가보면, python 자체가 모두 복제가 되어 있는 것을 알수 있다. bin/에는 python3등 실행 바이너리가 위치해 있다.

그렇다면, bin/외에 별도로 설치한 개별 패키지들은 어디에 위치해 있는 것일까?  가상환경의 rootdir 아래를 잘 살펴보면, lib/python3.x 위치를 살펴보자. 아래와 같이 `conda install` 로 설치된 패키지들이 .py 또는 라이브러리 형태로 저장되어 있다. 

~/anaconda3/envs/ML3/lib/python3.9 하위에 개별 설치한 패키지들이 저장되어 있다.

 

 

가상환경 활성화/비활성화 (Activate/Deactivate)

# 가상환경 활성화 -> 지정한 환경으로 root dir 변경
$ conda activate <가상환경 이름>
ex) $ conda activate ML3

# 가상환경 비활성화 -> 이전 환경으로 root dir 변경
$ conda deactivate

 

activate / deactivate가 어떤 역할을 하는지 살펴보기 위해서, 가상환경에 진입하여 각각 환경변수를 비교하여 보자. `$echo PATH`를 실행해 보면, 가상환경 rootdir아래 `bin/`와 `condabin/`가 최우선순위 경로로 변경되어 있는 것을 알 수 있다. 이것은 python 명령어를 실행하거나, python package를 실행할 경우 가상환경에서 먼저 찾아보라는 의미를 갖는다.

/home/xxxx/anaconda3/bin:/home/xxxxx/anaconda3/condabin:/home/xxxxxx/.pyenv/shims:

[ ML3 가상환경 진입후 ]

(ML3) data:~/anaconda3$ echo $PATH
//src/google-cloud-sdk/bin:/home//anaconda3/envs/ML3/bin:/home//anaconda3/condabin:/home//.pyenv/shims:/home//.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

[ ML3 가상환경 비활성화 후 ]

//src/google-cloud-sdk/bin:/home//anaconda3/bin:/home//anaconda3/condabin:/home//.pyenv/shims:/home//.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

 

 

가상환경 삭제 - conda remove

앞서 살펴본 가상환경 생성/동작원리를 이해하면, 여러가지를 자동적으로 파악 할 수 있다. 대표적으로 가상환경이 늘어나게 되면, 동일 PC/서버 환경에서는 그만큼의 Python Bin와 Package의 모든 파일이 `가상환경 개수`만큼 복제되어 있다고 할 수 있다. 

 

따라서, 불필요한 가상환경을 삭제가 필요하기도 하다. 가상환경을 삭제하려면, conda의 `remove` 명령어를 사용하면 된다. 

$ conda env remove -n <가상환경 이름>
ex) conda env remove -n ML3
당연하게도, 삭제하는 과정은 <anaconda home>/envs 아래에서 <가상환경 이름>에 해당하는 directory 자체를 삭제해 버리는 과정이다.

 

Conda Cheat Sheet

다음은 conda 공식 홈에서 제공하고 있는 conda cheat sheet이다. 

출처 : conda 공식 홈페이지 (https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf)

 

 

 

 

 

반응형

관련글 더보기

댓글 영역