Post

파이썬 가상환경 원리와 비교


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. 스크립트 또는 바이너를 포함한 독립된 디렉터리

    1. 특정 Python 인터프리터(또는 인터프리터에 대한 심볼릭 링크)
    2. 설치된 라이브러리 및 종속성(항상 site-packages)을 위한 별도의 디렉토리
    3. 해당 환경에 특정한 스크립트 또는 바이너리
  • 이 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 환경을 격리하는 방법은 다음과 같은 기술적 메커니즘을 조합하여 사용
  1. 디렉토리 구조 조작 모든 도구(venv, poetry, pyenv 등)는 가상환경 내에서 특정 디렉터리를 생성하거나 연결

    • bin/(또는 Windows의 경우 Scripts/): 파이썬 인터프리터와 환경에 설치된 모든 스크립트 또는 실행 파일을 포함
    • lib/pythonX.X/site-packages/: 설치된 모든 라이브러리가 있는 디렉터리. 각 가상환경마다 유일
  2. PATH 조작 가상환경 도구는 PATH 환경 변수를 수정하여 python 또는 pip와 같은 명령을 실행할 때 글로벌 버전이 아닌 가상환경의 바이너리를 사용하도록 함. 가상환경의 bin/ 디렉터리는 PATH에서 우선순위가 지정됨.

  3. sys.path 수정 가상환경 내에서 파이썬을 실행하면 가상환경의 site-packages 디렉터리를 포함하도록 sys.path가 수정됨. 이는 환경 구성을 변경하여 파이썬이 전역으로 설치된 패키지를 확인하기 전에 가상환경의 디렉터리에서 라이브러리를 찾도록 함으로써 수행됨.

  4. 환경 변수

    • 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.tomlpoetry.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: 환경 관리, 종속성 해결, 패키징을 단일 도구로 통합
  1. venv
  • 격리된 Python 환경을 만들기 위해 Python 3.3 이상에 포함된 경량 도구
  • 사용법: 최소한의 설정으로 기본적인 환경 관리에 적합합니다.
  • 제한 사항: 고급 기능 및 다국어 지원이 부족

  • 설치: Python 3.3 이상에서는 설치가 필요하지 않음.
  • Python 버전: Python 인터프리터와 동일한 버전을 사용
  • 환경 관리: 가상환경을 만들고, 활성화하고, 삭제하는 기본 명령어를 제공
  • 사용 용이성: 간단하고 직관적
  • 격리: 시스템 전체 패키지로부터 적당한 수준의 격리를 제공
  • 종속성 관리: pip를 사용하여 관리
  1. virtualenv
  • 오래되고 널리 사용되는 도구로, 추가 기능으로 venv를 확장
  • 사용 방법: venv보다 더 강력하며 이전 Python 버전을 지원
  • 제한 사항: 별도의 설치가 필요하며 다국어 지원이 부족

  • 설치: pip install virtualenv를 통해 설치
  • Python 버전: 지정한 경우 다른 Python 버전으로 환경을 만들 수 있음.
  • 환경 관리: 특정 Python 인터프리터로 환경을 만드는 등 venv에 비해 더 많은 옵션이 있음.
  • 사용 편의성: venv보다 유연하지만 추가 명령이 필요
  • 격리: 높은 격리 기능을 제공
  • 종속성 관리: pip를 사용하여 관리합
  1. virtualenvwrapper
  • 설명: 더 나은 환경 관리를 위한 virtualenv의 확장 프로그램
  • 사용법: 여러 환경을 쉽게 관리할 수 있는 명령을 제공
  • 제한 사항: 가상환경 및 추가 설정이 필요

  • 설치: pip install virtualenvwrapper를 통해 설치
  • 파이썬 버전: 환경 생성을 위해 virtualenv를 사용
  • 환경 관리: 환경을 쉽게 만들고, 삭제하고, 환경 간에 전환할 수 있는 명령(mkvirtualenv, rmvirtualenv, workon)을 추가
  • 사용 편의성: 여러 환경에서의 작업을 간소화
  • 격리: 높은 격리 기능을 제공
  • 종속성 관리: pip를 사용하여 관리
  1. pyenv
  • 여러 Python 버전을 관리하고 격리된 환경을 만들기 위한 도구
  • 사용법: 다양한 Python 버전이 필요한 프로젝트에 이상적
  • 제한 사항: 패키지가 아닌 Python 버전 관리에 중점

  • 설치: pyenv 및 선택적으로 pyenv-virtualenv의 설치 및 설정이 필요
  • 파이썬 버전: 여러 Python 버전을 관리하고 버전 간에 전환 가능
  • 환경 관리: 고급 관리 기능으로 다양한 Python 버전과 환경 간에 원활하게 전환할 가능
  • 사용 편의성: 더 복잡하고 여러 도구를 통합
  • 격리: 높은 격리 기능을 제공
  • 종속성 관리: pip를 사용하여 관리
  1. conda
  • Python 및 기타 언어를 위한 강력한 패키지 관리자이자 환경 관리자
  • 사용법: 다국어 지원이 필요한 데이터 과학 및 머신 러닝 프로젝트에 가장 적합
  • 제한 사항: 환경 규모가 더 크고 복잡

  • 설치: 아나콘다 또는 미니콘다 설치 필요
  • Python 버전: 여러 Python 버전을 관리하며 다양한 버전의 환경 가능
  • 환경 관리: 고급, 패키지 관리와 환경 관리가 하나의 도구에 포함
  • 사용 편의성: 사용자 친화적이며, 특히 데이터 과학 워크플로우에 적합
  • 격리: 높은 격리 기능을 제공
  • 종속성 관리: 콘다 패키지와 pip를 사용하여 관리
  1. 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.

This post is licensed under CC-BY-NC-ND-4.0 by the author.