파이썬 가상환경 원리와 비교
2024/08/11: 초안 작성
2024/08/18: 비교 표 작성
2024/10/19~20: 가상환경 도구 목적, 구현 원리 내용 수정, 보완
※ 내용에 오류가 있을 수 있습니다.
※ 내용을 계속 추가, 수정, 보완하고 있습니다.
목차
1. 파이썬 가상환경 도구 목적, 구현 원리
목적
파이썬 가상환경은 프로젝트별로 파이썬 버전을 분리하는 것이 가장 큰 목적이고, 해당 파이썬 버전을 기반으로 한 디펜던시 관리, 개발, 테스트, 배포를 목적으로 함.
파이썬 가상환경 도구들은 venv, virtualenv, virtualenvwrapper, pyenv, conda, poetry 정도가 있음.
파이썬에선 venv를 기본 제공하나 가상환경 크기가 작을 때 주로 사용.
venv는 디펜던시 관리를 기본 제공하지 않고(Conda나 Poetry가 기본 제공), 여러 개의 파이썬 버전 관리가 불가능, 글로벌 패키지 관리 Global Package Management 불가능(패키지 한 번 설치고 각 가상환경이 공유할 수 있는 것이 아니라 각각 모두 설치하게 되어 스토리지 낭비, 셋업 시간을 낭비하게 됨), 반드시 매뉴얼대로 가상환경 실행 및 종료(매뉴얼대로 실행, 종료하지 않은 경우 디펜던시 충돌이나 오류 발생 가능) 하여 비즈니스에 사용하기에 적절하지 않음.
pyenv의 경우, 공식 문서에서 windows를 공식적으로 지원하지 않고, Linux의 Windows 하위 시스템에서도 작동하지 않아 @kirankotari의 pyenv-win 포크해서 사용하라고 함. [GitHub] pyenv https://github.com/pyenv/pyenv?tab=readme-ov-file#windows
파이썬 가상환경 도구들의 격리 원리
파이썬 가상환경은 디렉터리, 경로, 환경 변수를 조작하여 파이썬 바이너리와 라이브러리를 격리하는 방식으로 구현
venv, pyenv, poetry, conda와 같은 도구는 각각 고유한 접근 방식을 가지고 있지만 기본적인 3가지 메커니즘으로 가상환경 구현. 이를 통해 여러 프로젝트가 서로 다른 종속성과 버전으로 관리하여 충돌을 최소화하고 Python 개발을 더 쉽게 관리할 수 있음.
파이썬 가상환경의 격리 방식
Python 가상환경은 기본적으로 특정 1. 인터프리터, 2. 라이브러리 및 종속성, 3. 스크립트 또는 바이너를 포함한 독립된 디렉터리
- 특정 Python 인터프리터(또는 인터프리터에 대한 심볼릭 링크)
- 설치된 라이브러리 및 종속성(항상 site-packages)을 위한 별도의 디렉토리
- 해당 환경에 특정한 스크립트 또는 바이너리
이 3가지는 가상환경을 실행할 때 패키지 설치나 스크립트 실행과 같은 모든 Python 작업이 해당 환경에만 국한되고 시스템 전체의 Python 설치나 다른 가상환경을 방해하지 않음.
주요 구성 요소
sys.prefix: Python의 sys.prefix가 변경되어 가상환경의 디렉터리를 가리켜 설치된 패키지가 해당 환경 내로 한정하도록 함.
환경 변수: 가상환경이 현재 활성화되어 있음을 파이썬(또는 개발자에게)에 알려주는 환경 변수 VIRTUAL_ENV가 설정됨.
경로 격리: 파이썬이 모듈을 찾는 위치를 결정하는 파이썬의 sys.path가 수정되어 가상환경 내의 패키지가 전역 패키지보다 우선순위를 갖도록 함.
가상환경 도구별 구현 세부 사항
1) venv(또는 virtualenv)
파이썬 인터프리터를 격리: venv를 사용하여 가상환경을 만들면 Python 인터프리터의 복사본(또는 심볼릭 링크)이 가상환경 디렉터리 내에 배치됨. 환경이 활성화될 때 해당 환경과 연결된 특정 Python 버전이 사용되도록 함.
Site-packages 격리: venv 도구는 가상환경 내의 별도의 Site-packages 디렉터리를 가리키도록 sys.path를 수정함. 이 디렉터리에는 가상환경 내에 설치된 모든 라이브러리가 포함되어 있어 전역으로 설치된 라이브러리와 섞이지 않도록 함.
환경 활성화: 환경을 활성화(source venv/bin/activate)하면 환경이 특정 셸 변수를 수정
- PATH: 가상환경의 bin 디렉터리가 시스템 경로 앞에 추가되어 가상환경의 Python 인터프리터 및 실행 파일(예: pip)이 먼저 검색되도록 함.
- VIRTUAL_ENV: 이 환경 변수는 가상환경의 루트를 가리키도록 설정됩됨. 도구는 이를 사용하여 격리된 환경 내에서 작동 중임을 알 수 있음.
비활성화 Deactivation: 가상환경이 비활성화되면 원래 시스템 경로가 복원되고 가상환경이 사실상 “꺼진” 상태가 됨.
2) pyenv
pyenv는 여러 버전의 파이썬 자체를 관리하기 위한 도구로, venv 또는 virtualenv와는 다른 방식으로 작동
서로 다른 Python 버전 간에 전환하는 데 도움이 되지만 본질적으로 venv처럼 프로젝트별 종속성을 관리하지는 않음.
버전 관리: PATH 변수를 수정하여 여러 Python 버전을 관리함. 호출되는 파이썬 바이너리를 효과적으로 변경하여 프로젝트마다 다른 버전의 파이썬을 사용할 수 있음. 숨겨진 디렉토리(~/.pyenv/versions)에 여러 버전의 Python을 설치하고 Shims을 생성하여 버전 간에 전환할 수 있음.
격리: pyenv 자체는 가상환경을 직접 관리하지는 않지만, venv와 유사한 가상환경 관리 기능을 추가하는 pyenv-virtualenv와 함께 사용할 수 있음. 이를 사용하면 pyenv로 설치하는 각 Python 버전에 대해 가상환경을 생성할 수 있음. 이 조합은 프로젝트별로 파이썬 버전 격리 및 패키지 격리를 모두 제공함.
3) Poetry
Poetry는 패키지 관리와 가상환경 관리를 결합한 Python용 종속성 관리자 및 프로젝트 관리자
격리된 환경: 기본적으로 poetry는 각 프로젝트에 대해 가상환경을 생성하며, 일반적으로 ~/.cache/pypoetry/virtualenvs 내에 생성됨. 이 환경을 자동으로 관리하고 종속성이 이 격리된 환경에 설치되도록 함.
작동 방식: poetry가 dependencies를 설치하면 시스템의 기본 Python 인터프리터(또는 정의된 경우 특정 버전)를 사용하여 가상환경을 생성함. 이 환경의 사이트 패키지 디렉터리가 글로벌 Python 설치와 분리되도록 함.
자동 활성화: venv와 달리 Poetry를 사용할 때는 환경을 수동으로 활성화하거나 비활성화할 필요가 없음. Poetry는 poetry run 또는 poetry shell과 같은 명령을 실행할 때 가상환경을 자동으로 사용. 가상환경은 pyproject.toml 파일에 의해 프로젝트에 연결
4) Conda
Python 네이티브 도구는 아니지만, 콘다는 Python 환경, 특히 데이터 과학에서 자주 사용
Conda 환경은 Python 가상환경과 유사하지만 더 낮은 수준에서 작동하며 C 라이브러리 등 Python이 아닌 종속성을 관리할 수 있음.
패키지 및 종속성 관리: Conda 환경은 Python 바이너리와 외부 라이브러리(예: NumPy, OpenSSL)를 포함한 전체 환경을 격리하는 방식으로 작동. 새 환경이 생성되면 콘다는 Python 인터프리터와 지정된 패키지를 격리된 디렉터리에 설치함.
교차 언어 지원: venv 또는 poetry와 달리 conda 환경은 파이썬이 아닌 패키지를 관리할 수 있음. 이는 시스템 전체 설치와 분리된 별도의 라이브러리 복사본을 환경 내에 유지 관리함으로써 이루어짐.
격리의 기술적 메커니즘
- 이러한 도구들이 Python 환경을 격리하는 방법은 다음과 같은 기술적 메커니즘을 조합하여 사용
디렉토리 구조 조작 모든 도구(venv, poetry, pyenv 등)는 가상환경 내에서 특정 디렉터리를 생성하거나 연결
- bin/(또는 Windows의 경우 Scripts/): 파이썬 인터프리터와 환경에 설치된 모든 스크립트 또는 실행 파일을 포함
- lib/pythonX.X/site-packages/: 설치된 모든 라이브러리가 있는 디렉터리. 각 가상환경마다 유일
PATH 조작 가상환경 도구는 PATH 환경 변수를 수정하여 python 또는 pip와 같은 명령을 실행할 때 글로벌 버전이 아닌 가상환경의 바이너리를 사용하도록 함. 가상환경의 bin/ 디렉터리는 PATH에서 우선순위가 지정됨.
sys.path 수정 가상환경 내에서 파이썬을 실행하면 가상환경의 site-packages 디렉터리를 포함하도록 sys.path가 수정됨. 이는 환경 구성을 변경하여 파이썬이 전역으로 설치된 패키지를 확인하기 전에 가상환경의 디렉터리에서 라이브러리를 찾도록 함으로써 수행됨.
환경 변수
- VIRTUAL_ENV: 환경이 활성화될 때 venv 및 poetry와 같은 도구로 설정함. 환경이 가상환경 내에서 작동하고 있음을 알 수 있도록 도와줌.
- PYENV_VERSION: 현재 환경에서 사용할 Python 버전을 지정하기 위해 pyenv에서 사용
여러 프로젝트 격리
가상환경에서는 각 프로젝트마다 고유한 종속성 집합을 가질 수 있음.
종속성을 별도의 디렉터리(site-packages)에 격리하면 프로젝트에서 다른 프로젝트와의 충돌을 걱정하지 않고 특정 버전의 라이브러리를 사용할 수 있음.
각 가상환경에는 자체 pip 또는 poetry 인스턴스가 있으므로 한 프로젝트에 설치된 종속성이 다른 프로젝트에 영향을 미치지 않음.
2. 파이썬 가상환경 도구 비교
|기능/도구|venv|virtualenv|virtualenvwrapper|pyenv|conda|poetry| |—|—|—|—|—|—|—| |기본 기능|가상환경 생성을 위한 핵심 파이썬 모듈|격리된 환경 생성을 위한 서드파티 라이브러리|보다 쉬운 관리를 위한 virtualenv 확장|여러 파이썬 버전과 가상환경 관리|환경 및 패키지 관리와 여러 언어 지원|프로젝트 종속성 및 가상환경 관리| |설치|기본 제공(Python 3.3 이상)|pip를 통한 설치 필요|pip를 통한 설치 필요|설치 및 설정 필요|설치 필요, 일반적으로 Anaconda를 통한 설치 필요|pip를 통한 설치 필요| |Python 버전 관리|불가능|pyenv 통합을 통해 제한적|pyenv 통합을 통해 제한적|가능|가능|불가능| |다국어 지원(Cross-Language Support)*|지원하지 않음|지원하지 않음|지원하지 않음|지원하지 않음|지원함|지원하지 않음| |환경 활성화 |source env/bin/activate
|source env/bin/activate
|workon <env_name>
|pyenv activate <env_name>
|conda activate <env_name>
|poetry shell
or automatic via poetry run
| |환경 생성|python -m venv <env_name>
|virtualenv <env_name>
|mkvirtualenv <env_name>
|pyenv virtualenv <version> <env_name>
|conda create -n <env_name>
|poetry init
and poetry install
| |격리 수준|파이썬 패키지만|파이썬 패키지만|파이썬 패키지만|파이썬 버전 및 패키지|전체(언어, 버전, 패키지)|파이썬 패키지만| |패키지 관리|pip 사용|pip 사용|pip 사용|pip 사용, virtualenv
과 통합 가능|conda 및 pip 사용|내장 패키지 관리자 사용| |글로벌 대 로컬 환경|로컬 전용|로컬 전용|글로벌 및 로컬 모두 관리|로컬 전용|글로벌 및 로컬 모두 관리|로컬 전용| |사용 용이성|기본|보통|높음|보통|높음|높음| |환경 변수|자동 관리 없음|자동 관리 없음|자동 관리|자동 관리 없음|자동 관리|자동 관리 없음| |프로젝트별 환경|지원하지 않음|지원하지 않음|지원하지 않음|pyenv-virtualenv 플러그인을 통해 지원함|지원함|지원함| |IDE와의 통합|기본|보통|보통|좋음|우수|우수| |크로스 플랫폼 지원|지원|지원|지원|지원|지원|지원| |가상환경 크기|작음|작음|작음|작음|클 수 있음(종속성 포함)|작음| |환경 재현성|requirements.txt
의존|requirements.txt
의존|requirements.txt
의존|requirements.txt
의존|환경 재현성 reproducibility을 위해 environment.yml
사용|pyproject.toml
및 poetry.lock
사용| |시스템 파이썬과 함께 사용|사용|사용|사용|사용|사용하지 않음(별도의 환경 필요)|사용| |파이썬이 아닌 패키지 지원|지원하지 않음|지원하지 않음|지원하지 않음|지원하지 않음|지원함|지원하지 않음| *다국어 지원(Cross-Language Support)이란 non-Python dependencies도 관리할 수 있게 지원
- 파이썬 가상환경은 다양한 도구와 방법을 사용하여 만들 수 있으며, 각각 고유한 기능, 이점 및 사용 사례가 있음.
여기서는 가장 많이 사용되는 방법인 venv, virtualenv, virtualenvwrapper, pyenv, conda, poetry를 비교
- 각 도구는 고유한 강점을 가지고 있으며 다양한 사용 사례에 적합. 적합한 도구를 선택하는 것은 특정 요구 사항, 워크플로, 프로젝트의 복잡성에 따라 달라짐.
어쨌든 적합한 도구를 선택해야
- 간단한 프로젝트의 경우: 기본적인 격리가 필요한 소규모 프로젝트에는 venv로 충분
- 고급 Python 프로젝트의 경우: VM 또는 pyenv는 복잡한 설정을 위한 더 많은 기능을 제공
- 데이터 과학: conda는 과학 패키지 및 비파이썬 종속성에 대한 광범위한 지원을 제공
최신 파이썬 프로젝트: poetry는 최신 개발 관행에 중점을 두고 종속성 관리를 간소화
- venv: Python 3.3 이상의 *간단한 기본 제공 환경 관리에 가장 적합
- virtualenv: venv보다 더 많은 유연성과 옵션을 제공하며, 이전 Python 버전을 지원
- virtualenvwrapper: 보다 사용자 친화적인 인터페이스로 여러 가상환경의 관리를 간소화
- pyenv: 특히 개발 환경에서 여러 Python 버전을 관리하고 격리된 환경을 만드는 데 이상적
- conda: 환경 및 종속성 관리를 위한 종합적인 도구로, 패키지 관리 기능이 있어 특히 데이터 과학 및 머신 러닝 프로젝트에 적합
- poetry: 환경 관리, 종속성 해결, 패키징을 단일 도구로 통합
- venv
- 격리된 Python 환경을 만들기 위해 Python 3.3 이상에 포함된 경량 도구
- 사용법: 최소한의 설정으로 기본적인 환경 관리에 적합합니다.
제한 사항: 고급 기능 및 다국어 지원이 부족
- 설치: Python 3.3 이상에서는 설치가 필요하지 않음.
- Python 버전: Python 인터프리터와 동일한 버전을 사용
- 환경 관리: 가상환경을 만들고, 활성화하고, 삭제하는 기본 명령어를 제공
- 사용 용이성: 간단하고 직관적
- 격리: 시스템 전체 패키지로부터 적당한 수준의 격리를 제공
- 종속성 관리: pip를 사용하여 관리
- virtualenv
- 오래되고 널리 사용되는 도구로, 추가 기능으로 venv를 확장
- 사용 방법: venv보다 더 강력하며 이전 Python 버전을 지원
제한 사항: 별도의 설치가 필요하며 다국어 지원이 부족
- 설치: pip install virtualenv를 통해 설치
- Python 버전: 지정한 경우 다른 Python 버전으로 환경을 만들 수 있음.
- 환경 관리: 특정 Python 인터프리터로 환경을 만드는 등 venv에 비해 더 많은 옵션이 있음.
- 사용 편의성: venv보다 유연하지만 추가 명령이 필요
- 격리: 높은 격리 기능을 제공
- 종속성 관리: pip를 사용하여 관리합
- virtualenvwrapper
- 설명: 더 나은 환경 관리를 위한 virtualenv의 확장 프로그램
- 사용법: 여러 환경을 쉽게 관리할 수 있는 명령을 제공
제한 사항: 가상환경 및 추가 설정이 필요
- 설치: pip install virtualenvwrapper를 통해 설치
- 파이썬 버전: 환경 생성을 위해 virtualenv를 사용
- 환경 관리: 환경을 쉽게 만들고, 삭제하고, 환경 간에 전환할 수 있는 명령(mkvirtualenv, rmvirtualenv, workon)을 추가
- 사용 편의성: 여러 환경에서의 작업을 간소화
- 격리: 높은 격리 기능을 제공
- 종속성 관리: pip를 사용하여 관리
- pyenv
- 여러 Python 버전을 관리하고 격리된 환경을 만들기 위한 도구
- 사용법: 다양한 Python 버전이 필요한 프로젝트에 이상적
제한 사항: 패키지가 아닌 Python 버전 관리에 중점
- 설치: pyenv 및 선택적으로 pyenv-virtualenv의 설치 및 설정이 필요
- 파이썬 버전: 여러 Python 버전을 관리하고 버전 간에 전환 가능
- 환경 관리: 고급 관리 기능으로 다양한 Python 버전과 환경 간에 원활하게 전환할 가능
- 사용 편의성: 더 복잡하고 여러 도구를 통합
- 격리: 높은 격리 기능을 제공
- 종속성 관리: pip를 사용하여 관리
- conda
- Python 및 기타 언어를 위한 강력한 패키지 관리자이자 환경 관리자
- 사용법: 다국어 지원이 필요한 데이터 과학 및 머신 러닝 프로젝트에 가장 적합
제한 사항: 환경 규모가 더 크고 복잡
- 설치: 아나콘다 또는 미니콘다 설치 필요
- Python 버전: 여러 Python 버전을 관리하며 다양한 버전의 환경 가능
- 환경 관리: 고급, 패키지 관리와 환경 관리가 하나의 도구에 포함
- 사용 편의성: 사용자 친화적이며, 특히 데이터 과학 워크플로우에 적합
- 격리: 높은 격리 기능을 제공
- 종속성 관리: 콘다 패키지와 pip를 사용하여 관리
- poetry
- 패키지 관리와 환경 생성을 간소화하는 종속성 관리 도구
- 사용법: Python 프로젝트를 위한 사용하기 쉬운 명령어와 자동 환경 처리를 제공
제한 사항: Python에 중점을 두며, Python이 아닌 패키지는 지원하지 않음.
- 사용법: 종속성을 관리하고 가상환경을 자동으로 생성
- 설치: 설치: pip 또는 설치 스크립트를 통해 설치
- 격리: 각 프로젝트에는 고유한 환경과 종속성 트리가 있음.
- 장점:
- 잠금 파일(poetry.lock)로 통합 종속성 관리
- 종속성을 자동으로 해결
- 패키지와 환경을 모두 원활하게 관리
- 단점:
- 의견 구조에 적응이 필요할 수 있음.
- 간단한 프로젝트에는 과할 수 있음.
Poetry의 강점 및 사용 사례
종속성 관리: Poetry는 복잡한 종속성 그래프를 해결하고, 프로젝트의 종속성을 최신 상태로 유지하고, 여러 환경에서 재현성을 보장하는 잠금 파일(poetry.lock)을 생성하는 등 종속성 관리에 탁월한 기능을 제공
프로젝트 관리: Poetry는 Python 프로젝트 관리를 위한 올인원 솔루션을 제공. 프로젝트의 구조 설정, pyproject.toml 파일의 종속성 정의부터 PyPI에 패키지 게시까지 모든 것을 처리합니다.
가상환경 처리: Poetry는 가상환경을 자동으로 생성하고 관리하므로 환경을 수동으로 설정하거나 활성화할 필요 없이 개발에만 집중할 수 있음.
재현성: 콘다와 마찬가지로 Poetry는 재현성을 강조. pyproject.toml 및 poetry.lock 파일을 사용하면 다양한 컴퓨터와 환경에서 프로젝트를 안정적으로 재현할 수 있음.
최신 개발 관행: Poetry는 파이썬 생태계 전반에서 점점 더 많이 채택되고 있는 pyproject.toml 표준을 수용하여 최신 파이썬 개발에 맞게 조정되었음.
[참고자료]
[Medium] Python: Virtual environment with full guides, Advantages, and Disadvantages,
Jun 7, 2024 https://medium.com/@muhammadshafey063/python-virtual-environment-with-full-guides-advantages-and-disadvantages-973166f5708f#:~:text=Disadvantages%20of%20Virtual%20Environments%3A,can%20be%20intimidating%20for%20beginners.