가상환경이란?

개발 시 다양한 라이브러리와 의존성을 효과적으로 관리하기 위해 가상환경을 사용하는 것이 일반적이다. 가상환경은 프로젝트별로 독립된 파이썬 실행 환경을 제공하여, 서로 다른 프로젝트 간의 의존성 충돌을 방지한다.
가장 널리 사용되는 세 가지 가상환경 관리 도구인 pipenv, venv, conda에 대해 알아보고, 각각의 특징과 차이점을 비교해보자.
1. pipenv
파이썬에서 공식으로 권장하는 패키지 관리 도구이다. (가장 많이 사용됨)
특징
- 가상환경과 의존성 관리 통합:
pip
와venv
의 기능을 하나로 합쳐서, 프로젝트별 가상환경을 자동으로 생성하고 관리하며, 필요한 패키지를 설치한다. - 명시적인 의존성 관리:
Pipfile
과Pipfile.lock
두 파일을 사용하여 프로젝트 의존성을 관리한다.Pipfile
은 프로젝트가 의존하는 패키지를 명시하고,Pipfile.lock
은 설치된 패키지의 정확한 버전을 기록하여 모든 개발자와 환경에서 일관된 설치가 가능하게 한다. - 보안과 안정성: 자동으로 생성된
Pipfile.lock
을 통해 의존성을 잠그고(즉, 정확한 버전을 기록하고), 이를 사용하여 환경을 재구성한다. 이는 의존성과 관련된 보안 취약점을 예방하고, 프로젝트의 안정성을 높이는 데 유리하다. - Dependency Graph 시각화 기능 제공: 명령어
pipenv graph
사용방법
# pipenv 설치
pip install pipenv
# 새 프로젝트에서 가상환경 생성 및 활성화
pipenv --python '원하는 버전'
# 가상환경 제거
pipenv -rm
# 프로젝트 종속성 설치
pipenv install <package>
# 가상환경 활성화
pipenv shell
# 가상환경 비활성화
exit
2. venv
venv
는 파이썬 3.3 버전 이상에서 기본적으로 제공되는 가상환경 생성 도구이다.
특징
- 표준 라이브러리 일부: 파이썬 개발 환경을 설정할 때 별도의 도구를 설치할 필요 없이 바로 사용할 수 있다
- 간단하고 쉬운 사용법: 간단한 명령어 몇 개만으로 쉽게 가상환경 생성 및 관리할 수 있다.
- 제한된 기능: 패키지 관리 및 가상환경 관리에 필요한 기본적인 기능만 제공해, 기능이 제한되어 있다.
사용 방법
# 가상환경 생성
python -m venv <env_name>
# 가상환경 활성화
# Windows
<env_name>\Scripts\activate
# MacOS/Linux source
<env_name>/bin/activate
# 의존성 설치
pip install <package>`
3. conda
Anaconda 배포판에 포함된 크로스 플랫폼 가상환경 및 패키지 관리 도구이다.
특징
- 크로스 플랫폼: Window, Mac, Linux 등 다양한 OS에서 사용할 수 있어 호환성이 높다.
- 여러 언어 지원: 파이썬뿐만 아니라 R, Ruby, Lua, Scala, Java, JavaScript, C/C++ 등 다양한 프로그래밍 언어의 패키지를 관리할 수 있다. 이는 다양한 언어로 작업하는 복합적인 프로젝트 환경에서 특히 강력한 기능을 제공한다.
- 의존성 충돌 방지: 패키지 간의 의존성을 체크하여 충돌을 방지한다.
- 환경 복제:
enviroment.yml
파일을 통해 가상환경을 내보내 재현할 수 있다.단점 - 라이센스 문제: 팀/회사 등에서 사용 시 라이센스를 구매해야 한다.
- 기본 의존성 문제: pandas, numpy 등이 기본으로 설치되어 있어 가상환경 크기가 크다.
- 호환성 문제: conda패키지의 크기가 크고 베이스 이미지와 호환되지 않는 경우가 있어서 Docker 이미지를 빌드하기 번거롭다.
사용 방법
# conda 가상환경 생성
conda create --name <env_name> python=3.8
# 가상환경 활성화
conda activate <env_name>
# 패키지 설치
conda install <package>
Docker
Docker는 도커 컨테이너를 생성시키는 라이브러리다.
가상환경 도구들은 python프로젝트의 종속성 구조만 보는 반면, 도커 컨테이너는 OS의 이미지 전체가 포함되어 있다. 가상환경은 python의 의존성을 캡슐화 하지만 도커 컨테이너는 OS 전체를 캡슐화 한다.
Python 버전, 라이브러리에 대한 의존성을 완벽하게 해도 다른 사람의 코드가 안 돌아갈 때가 있다. 이런 경우 대부분 OS가 원인이라고 한다 결국 OS까지 다 동일하게 맞춰줘야 한다.
이럴 때, 또는 배포할 때 이식성, 확장성 등이 좋은 Docker를 사용한다고 한다.
지금까지는 다른 가상환경 관리 도구들이 있는지 모르고 anaconda에 내장되어 있는 Conda가상환경만 사용하였는데, 앞으로는 Pipenv를 사용하도록 하고, 다음에는 OS까지 캡슐화시킬 수 있는 Docker에 대해서 공부해봐야겠다.
'Programming > Python' 카테고리의 다른 글
[Python] 반복문(for문)으로 변수 여러개 한 번에 선언하기, globals() (2) | 2024.06.09 |
---|---|
[Python] while문에서 tqdm 사용하기, 구글 이미지 크롤링(스크래핑) (0) | 2024.04.28 |
[Python] argparse 모듈 사용법 (0) | 2024.04.13 |
[Selenium] iframe에 있는 element 크롤링하기, NoSuchElementException error (0) | 2024.04.09 |
[Python] List comprehension 리스트 안에서 for문, if문 사용하기 (0) | 2024.04.09 |