본문 바로가기
Programming Languages/Python

파이썬 가상환경을 왜 써야할까...?

by Calvin H. 2022. 5. 31.

소개

파이썬 가상환경에 대한 정보는 많다. 인터넷에 쳐보게 되면 수많은 결과를 볼 수 있다.
내가 애용하는 사이트는 RealPython.org 인데 정말 깔끔한 문서와 내용은 늘 대단하다고 생각한다.

아무튼, 오늘은 내가 경험한 콘다 가상환경과 pipenv 에 대해서 몇 글자 끄적이고자 한다.

파이썬의 패키지 관리

파이썬에서는 패키지 관리가 하나의 버전만 가능하기 때문에 이에 따라 여러 개의 버전을 사용하기가 쉽지 않다. 간단하게 말해서 파이썬에서 기본으로 사용하는 패키지들은 파이썬에서 따로 관리를 하기 때문에 버전 관리를 신경쓸 필요가 없다.

하지만 문제는 제3자의 패키지에서 발생한다. 눈치챘겠지만 파이썬의 기본 라이브러리는 알아서 관리하면 사실상 버전에 따른 패키지 버전 문제는 대부분 알아서 해결해 준다는 것이다.

기본적으로 제공하지 않는 패키지가 문제이다. 얘네들은 파이썬 버전을 신경써야 하고 업데이트가 되면서 기능들이 새로 생기거나 변하거나 제거되거나 하는 등 다양한 변화를 겪는다.
이 때 이러한 변화에 따라 버전이 증가하는데 이러한 증가로 인해 거미줄처럼 이어진 패키지 의존은 위태로워진다.

그래서 가끔가다 보면 터미널에서 업데이트를 하라거나 곧 사라진다거나 하는 등의 메세지들을 표시해 사용자들이 인지를 할 수 있게끔 해주기도 한다.

말이 길었지만 다시 집중하면 이러한 제3자 패키지들의 버전은 많아지는데 파이썬에서는 여러 개의 버전을 동시에 관리할 수가 없다.
예를 들어 버전 1.0.0 을 쓰고 있으면 버전 2.0.0 을 설치하는 순간 파이썬에서는 1.0.0 이 사라진다.

그 이유는 매우 단순하다. 파이썬은 패키지들을 보관할 때에 버전을 따로 명시하지 않는다. 그렇기 때문에 버전이 다르던 어떻든 같은 패키지로 인식을 하고 덮어쓰는 형식이다.

이렇게 되면 각각 특정 버전을 요구하는 프로젝트 몇 개가 존재하는 순간 망이다. 한번에 하나씩 프로젝트를 돌리거나 인생의 새로운 목적지를 향해 가야한다.

이 단점을 보완하기 위해 파이썬 가상환경이라는 것이 나왔는데... 엄청 많다. pipenv, conda, virtualenv, pyenv 등... 많다. 그리고 다 장단점이 있고 특성이 존재한다.

여기에서는 딱 내가 최근에 사용하고 있는 두 개만 소개할텐데 시간이 되면 다른 것들도 찾아보는 것을 강력 추천한다.


Conda Virtual Environment

일단 conda, miniconda, anaconda 이렇게 3 가지로 되어 있긴 하지만 보통은 아나콘다 하나로 설치를 하게 되는 도구, Anaconda.

컴퓨터에 설치하게 되면 GUI 툴들과 함께 여러가지를 제공한다. 주로 데이터과학 분야에서 많이 사용이 되는 도구들이기 때문에 데이터 분석에서는 아나콘다를 대부분 알고 있다.
어쨌든 간에 설치를 하게 되면 CLI 도구들도 같이 따라온다. 물론 필요에 따라 GUI 를 제외한 miniconda 나 패키지 관리 도구인 conda 만 설치할 수도 있다.

사실 설치가 최대 고비라고 할 수 있을만큼 가상환경을 만들기가 매우 쉽다.

단순하게 다음과 같이 터미널 명령어를 입력하면 가상환경이 설정된다.

$ conda create -n 가상환경_이름

이러면 끝이다.

콘다의 가상환경은 사실 파이썬에 특화되어 있다고 볼 수는 없다. 콘다에서 파이썬 가상환경을 따로 만들 수는 있긴 하지만 사실상 콘다 에코시스템의 관점에서 바라보는 것이 더 바람직하다.
콘다를 통해 파이썬 버전을 따로 명시하지 않은 경우 기본 설정을 사용한다. 환경에 따라 시스템 파이썬을 사용하거나 콘다의 기본 파이썬 버전을 사용한다.

그렇기 때문에 파이썬 가상환경을 만들기 위해서는 사실상 파이썬 버전을 명시해줘야 한다.

$ conda create -n 가상환경_이름 python=3.8

이름을 명시하지 않는 경우 콘다는 가상환경을 만들어주지 않는다.

위와 같이 3.8 버전의 파이썬을 설치해주면 이때부터 깨끗한 상태에서 파이썬 패키지를 따로 관리하게 된다. 그렇지 않으면 위에서 설명한 것처럼 시스템 파이썬이나 콘다의 기본 파이썬을 사용하기 때문에 이미 pip list 가 긴 상태일 수도 있다.

이제 가상환경에 진입하면 되는데 진입은 다음과 같다.

$ conda activate 가상환경_이름

만약에 가상환경의 이름을 까먹었거나 어떤 환경들이 존재하는지 알려면 다음 명령어로 확인할 수 있다.

$ conda info --envs

콘다의 가상환경을 종료하려면 다음과 같다.

$ conda deactivate

이렇게 콘다를 사용하게 되면 큰 장점은 매우 쉽다는 것... 그냥 이름만 정해주면 알아서 콘다 가상환경 폴더에서 따로 관리를 해준다. 더 좋은 점은 파이썬에 한정된 것이 아니기 때문에 다른 패키지들도 필요할 때 사용할 수 있다.

특히 콘다만의 패키지 인덱스가 있어서 'conda' 혹은 'pip' 으로 원하는 패키지를 설치할 수가 있다.

단점은... 사실 이 동일한 환경을 다른 곳을 옮기기가 쉽지가 않다. 물론 현재 사용하고 있는 pip list 를 'requirements.txt' 에 저장해서 다른 곳에서 동일하게 설치하면 되긴 하는데, 슬쩍 봤을 때에는 문제가 없어 보이지만 sub-dependency 이슈들이 발생할 수 있다. 예를 들어 다음과 같이 현재 사용하는 패키지들의 버전들을 저장한다고 해보자.

$ pip freeze > requirements.txt

그렇다면 모든 패키지들이 현재 사용하고 있는 버전을 그대로 저장이 된다. 하지만 이렇게 된다면 각 패키지 내에서 필요한 sub 패키지 또한 저장이 되어야 좋을텐데 이렇게 못하는 경우가 발생한다. 따라서 가장 상위의 dependencies 만 저장되는 경우도 발생할 수가 있다.


pipenv

다음으로 얘기하고 싶은 것은 pipenv 라는 파이썬 가상환경 관리 도구이다.

지금 가장 많이 사용하고 있기도 하다. 사실 완벽하다고 할 수는 없지만 그래도 나름 적절한 도구이다. 일단 콘다와의 차이점은 가상환경마다 이름이 없다는 것이다. 또한 따로 파이썬 버전을 설치한다면 cPython 으로 설치가 되는 것으로 알고 있다. 콘다와 달리 가상환경이라는 것을 알 수 있는 방법을 제공하는데 폴더 내에 'Pipfile' 이나 'Pipfile.lock' 등의 파일을 남긴다.

pipenv 는 따로 락파일을 만들어 현재 사용하고 있는 주 패키지들을 관리할 수 있는데 실제로 이 파일을 열어보고 이해하지 않아도 된다.

pipenv 의 최대 장점은 내가 봤을 때에 Pipfile 체계이다. 따로 폴더를 만들어 파이썬과 패키지등을 관리하기도 하는데 사실상 프로젝트 폴더 내에는 Pipfile 만 존재해도 괜찮다.

음... 다음 장점은 CLI 인데, 이게 너무 편하다. Pipfile 만드는 것부터 Pipfile 에서부터 필요한 패키지들을 설치하는 것, 쉘에 따로 접근해 환경을 새로 구출할 수 있다는 점 등 장점들이 상당히 많다.

하지만 설치나 익숙해지는 시간이 확실히 필요하다.

설치가 완료되었으면 다음과 같이 프로젝트 폴더에서 가상환경을 새로 시작할 수 있다.

$ pipenv --python 3.7

이 때 컴터에 파이썬 버전이 없다면 알아서 따로 설치를 하는데... 오류가 발생해서 해결해야 할 수도 있다... 이걸 관리하기 위해 pyenv 를 설치하게 되면... 처음 접하기에는 더 복잡해질 수도 있다...

다 설치가 완료되면 해당 폴더에서 쉘을 킬 수 있다.
쉘이란 쉽게 말해 분리된 공간에서 작업할 수 있는 환경을 제공한다. 즉, 파이썬이 따로 분리되어 있는 상태라고 보면 된다.

$ pipenv shell

나가는 방법은 당황하지 말고

$ exit

이다. 만약에, 정말 만약에 control-c 와 같은 종료 단축키를 누른다 해도 정상적으로 종료가 되는 것이 아닌 쉘과의 연결이 끊기는 거다. 따라서 쉘은 사실상 돌아가고 있다. 이 때 위 명령어를 치면 된다. 안되면 컴터 다시 시ㅈ...

$ pipenv install 패키지_이름

으로 패키지를 새로 설치하게 되면 알아서 Pipfile 에 관리를 해준다.

매우 편리... 인정...

그리고 다른 환경에서 Pipfile 의 내용을 설치하고 싶다! 그러면 다음 명령어로 하면 된다.

$ pipenv install --dev

위 명령어는 Pipfile 에 명시된 dev, 즉 개발에 사용되는 패키지들을 포함해 전부 설치할 수 있도록 해준다.


아무튼 조금 부족했지만 나름 사용하고 있는 것들을 이렇게 나열해봤다. 봐서 다음에는 pyenv, virtualenv 등에 대해서도 얘기할 수도 있지만... 모르겠다. 지금 너무 편함

'Programming Languages > Python' 카테고리의 다른 글

Python Pytest 관해서  (0) 2022.06.01
Python Testing  (0) 2022.06.01