Anaconda VS pipenv
개발환경과 배포환경간에 사용되는 패키지와 버전들을 잘 관리해줄 필요가 있다.
node.js를 사용한다면 package.json으로 프로젝트마다 사용되는 패키지들을 관리할수 있고,
Spring이나 Spark를 사용해도 Maven이나 Gradle같은 좋은 패키지 관리자들이 있다.
파이썬의 pip는 아주 고약하게도 모든 패키지가 global하게 설치된다.
이해하는가? global하게 설치된다. 이것은 굉장히 불편한 단점이다. 다시 말하면 이것은 단점이다.
우리가 원하는것은 적어도 프로젝트 마다 패키지들을 설치하고 해당 프로젝트에서 어떤 패키지들을
사용하고 있는지 확인할 수 있어야 하며, Git을 이용해서 배포 환경에 프로젝트가 업로드 되었을 때,
배포 환경에서도 우리가 필요한 패키지만 딲딲(?) 설치되어야 우리의 마음이 평온해진다.
그런데, Global 하게 설치 된다는것은 이모든것은 무용지물하게 만든다.
그래서 Python 에서 패키지를 관리하는 여러 방법들이 있는데 그중에 유명한 2가지 방법을 비교해본다.
1) anaconda (아나콘다)
2) pipenv (피펜) -몰라 그렇게 발음하더라. 백형들이.
결론을 먼저 던지고 시작하자면, 나는 둘다 질릴정도로 깊게 사용해보았지만, 뭐가 더 낫다 좋다 라고
판단하지 않을 예정이다. 둘다 손가락이 많이 들어가고, 편한점도 있고 불편한점도 있다.
나의 결론은 둘다 좋다.
- 둘다 같은 가상의 환경을 만들어놓고 그 환경에서 프로젝트를 진행할수 있으며, 그 가상환경을
묶어 배포 할수 있는 기능이 다 있기 때문에 사실상 둘다 우리가 원하는 기능이 다 있다.
- 둘다 초보자는 설치만해도 오래 걸릴것이도 분명 사용방법에 습득에 짜치는 점이 있다.
하지만 공부하면 된다.
- 둘다 파이썬 3을 잘 지원한다. (파이썬2 쓰시는분 계시죠?)
- 둘다 배포가 편하다.
이런 결론을 먼저 내놓고 시작해보자.
1. 패키지 이용 편리성
먼저 아나콘다부터 설명하면 아나콘다는 pip 을 활용한 패키지 설치 뿐만 아니라.
conda 를 활용한 패키설치를 할수 있다. 유독 데이터 과학자들이 많이 사용하는 기계학습 및
프레임워크를 포함해서 대략 1500개 이상의 패키지가 아나콘다 저장소에 들어있다.
conda-forge 와 bioconda를 포함한 채널링에서 아나콘다 클라우드에 제공하는 수천개의
추가 패키지와 함께 conda를 사용하여 설치할수 있다. 이많은 패키지 모음에도 불구하고
PyPi에서 이용할 수 있는 15만개 패키지에 비하면 적지만, pip를 이용해서 PyPi에 있는 패키지를
설치할수 있다, 이경우에 PyPi에 있는 패키지와 conda를 이용해서 설치한 같은 패키지의
종속성 문제를 체크해야한다. ( 두통의 시작!! ) 그리고 PyPi에 새롭게 등록된 패키지는 아나콘다
저장소에 등록되는데 보통 몇주혹은 몇일정도의 지연이 있다.
pipenv는 PyPi의 패키지를 모두 이용하기때문에 이부분에서는 아나콘다보다 pipenv가 이긴거같다.
2. 의존성 해결하기
Conda
$ conda create --name env_metashower numpy==1.15.3 pandas python=3.7
위 내용에서 numpy에 의존성을 가지는 pandas를 설치하는 명령이고 numpy의 버전을 1.15.3로 지정하여 설치하면 자동으로 pandas는 numpy 1.15.3을 지원하는 마지막 버전인 pandas 1.0.5를 설치하게 된다.
Pipenv
pipenv환경에서도 위와 같은 패키지를 설치하려고 시도 해보자.
$ pipenv install numpy==1.15.3 pandas --python 3.7
Pipenv는 numpy 1.21.4을 사용하여 환경을 생성하는데 이건 내 pandas 환경과 사양에 맞지 않는다. pipenv는 충돌이 잇는것으로 판단하여 pipfile.lock 을 만들수 없고 요런 실패 문구를 개발자에게 안내한다.
✘ Locking Failed!
There are incompatible versions in the resolved dependencies:
numpy==1.15.3 (from -r /tmp/pipenvzq7o52yjrequirements/pipenv-5bf3v15e-constraints.txt (line 3))
numpy>=1.16.5 (from pandas==1.2.0->-r /tmp/pipenvzq7o52yjrequirements/pipenv-5bf3v15e-constraints.txt (line 2))
pipenv는 또한 종속성 그래프를 출력하고 패키지가 서로 의존하는 방식을 추적할 수 있게 해주는
그래프와 역방향 명령을 가지고 있다.
$ pipenv graph
pandas==1.2.0
-numpy [required: >=1.16.5, installed: 1.19.5]
-python-dateutil [required: >=2.7.3, installed: 2.8.1]
— six [required: >=1.5, installed: 1.15.0]
-pytz [required: >=2017.3, installed: 2021.11]
pip 종석성을 확인기가 변경되고 있다. 최신버전을 사용했는데 pip 버전에 따라서 따라서 결과가 달라질수 있다.
현재 나의 pip 버전은 21.3.1
매번 종속성 그래프를 따져야 하는 pipenv 보다는
이번엔 한방에 알잘딱깔센 처리하는 anaconda가 이긴거같다.
3. 패키지의 사양
업그레이드 가능한 빌드를 보장할수 있나?
pipenv는 두개의 파일을 사용하여 종속성을 지정한다. 직접 종속성은 pipfile 이고
직접 및 간접 종속성은 pipfile.lock 이다. pipfile.lock을 사용하여 환경을 생성하면 패키지의 해시를
포함하여 정확히 동일한 패키지가 설치된다. (배포환경에서 이렇게 사용해야한다.)
pipfile을 사용하여 환경을 만들면 필요한 경우 간접 종속성을 유연하게 업그레이드 할수 있다.
즉, 패키지버전을 자기 맘대로 올려버린다는 뜻이다. 이것은 문제가 될수도 있다. 서버 개발을 하는
입장에서 팀원내에서 함께 일하는 사람들의 사용 패키지의 버전이 달라질수 있다는 것이고,
개발환경과 배포 환경에서 패키지의 버전이 달라질수 있다는것을 의미하는데, 간접 종속성이라는것을
pipfile이 알아서 판단하고 버전을 올리긴하지만 여간 신경이 안쓰일수 가 없다.
Conda는 environment.yaml 파일을 사용하여 직접, 간접 종속성을 모두 지정한다. 개발자가 새로운
환경에 이 yaml파일로 환경을 구성할때 시행착오를 좀 겪을수 있는데 , pipenv에서 pipfile.lock의
패키지를 복제하는 conda-lock 라이브러리가 있지만 아직 아나콘다에서 지원하지 않는다.
하지만 yaml파일로 환경 자체를 통째로 꾸미고 업데이트 할수지만 매번 환경을 지우고 새로 만들긴
해야하나보다.
4. Disk Space
각 환경은 얼마나 많은 공간을 차지 할까?
대부분의 개발환경에서 패키지의 크기 차이는 거의 나지 않는다. 하지만 이것만은 알고가자,
데이터 분석을 하는 사람들이 많이 사용하는 jupyter와 pandas가 있는 아나콘다의 환경은
1.7G를 차지한다. 하지만 pipenv 환경에서는 208MB를 차지 한다.
데이터 과학자의 규모가 더 크기 때문에 데이터 과학자는 종종 conda 환경을 여러 탐색 프로젝트에
쓰거나, 동일한 솔루션에서도 여러 프로젝트를 사용하기도 하기도한다.
Pipenv 환경은 프로젝트 저장소에 바로 설치가 된다. pipenv가 생성되면 pip파일을 저장소의 루트에
저장하게 된다. 설치된 패키지는 기본적으로 ~.local/share/.virtualenvs/ 에 저정된다.
여기서 pipenv는 새 디렉토리를 생성하고 경로의 해시를 이름에 추가해서 repository당 하나의 환경을
생성한다. 환경을 활성화 하려면 개발자가 프로젝트의 저장소 루트에 CD를 저장해야하지만 디렉터리를
나가더라도 셀은 활성화된 상태로 유지된다. (콘다도 마찬가지) 별도의 디럭토리에 pip 파일을
저장함으로써 여러 프로젝트에 걸쳐 환경을 공유할수 있고 그런 다음 사용자는 환경을 활성화 하고
업데이트 하려면 저장소에 CD 다시 저장하면 된다.
5. 보안
패키지를 설치하는것이 안전할까?
아나콘다 메인 채널인
전에 엄격한 보안검사를 거친다. Pypi를 사용하는 pipenv의 경우 누구나 모든 패키지를 업로드
할 수 있으며 과거에는 악성 패키지가 업로드 되기도 하였다.
기사보기
아티펙트가 저장소에 업로드되기 전에 검증하는 프로세스를 개발중이고 conda-forge도 마찬가지다.
jfrog의 xray를 사용해서 보안검사를 해볼수도 있고, 한달 이상지난 패키지만 설치하는것도 방법이다.
6. 수명
conda/pipenv 어느게 더 오래 운영될까?
pipenv는 2017년에 처음 도입되었고 큰 인기를 자치하였다. 하지만 2018년 11월 부터 2020년 5월
까지는 새로운 코드가 작성되지 않아 미래에 대한 우려가 제기되었다.
pipenv는 현재 새로운 개발자들이 영입되어 2020년 5월이후 월간 릴리즈가 정기적으로 업데이트
되고 있다. anaconda는 2012년 scipy.org를 관리하는 팀이 맡아 운영되고 있다. conda는 오픈소스
도구이지만 아나콘다 저장소는 영리 단체인 anaconda Inc. 에 의해 호스팅 되고 있다. 이는
conda/anaconda가 조만간 사라질 가능성은 매우 낮다고 볼수 있다. 하지만 또 다시 생각하면
아나콘다 주식회사가 사용자들에게 요금을 부과 하기 시작할수도 있다는것을 우려해볼수 있다.
그들은 최근에 아나콘다 저장소를 미러링하는 것을 포함하여 해비 유저나 상업용 유저에게 요금을
부과하도록 약관을 변경했다.'