Engineering/Engineering

[Engineering Basic] 파이썬 버전 관리

iamzieun 2023. 4. 24. 22:47

1. 버전 관리

1.1 버전과 버저닝

  • 버전 Version
    • 소프트웨어 제품의 특정 릴리스에 대한 고유한 식별자
      • 소프트웨어가 처음 출시 되었을 때 및 업데이트가 이루어졌을 때마다 새로운 버전 번호를 부여
    • ex. Python 3.11.0, Ubuntu 20.04 등
  • 버저닝 Versioning
    • 버저닝이란?
      • 소프트웨어에 버전 번호를 할당하는 과정
      • 다양한 버전을 관리하고 식별하기 위해 사용되는 방법
      • 버전을 정의하는 방법
    • 버저닝의 방법
      • CalVer (Calender Versioning)
        • 날짜에 기반하여 버전 번호를 할당하는 방법
        • 연도, 월, 및 패치 버전으로 버전 번호를 구성
        • 버전 번호에 대한 직관적인 이해가 가능하고, 버전 번호를 통해 출시 시기를 예측하기 쉽다.
        • ex. Ubuntu 22.04
      • SemVer (Semantic Versioning)
        • 주 번호, 부 번호, 패치 번호로 버전 번호를 구성
        • 이전 버전과 호환되지 않는 변경이 있는 경우 주 번호가 증가
        • 이전 버전과 호환되며 새로운 기능이 추가되면 부 번호가 증가
        • 이전 버전의 버그 수정이 진행되면 패치 번호가 증가
        • ex. Python 3.11.0
      • HashVer (Hash Versioning)
        • SHA-1, SHA-256 해시 알고리즘을 사용하여 고유한 버전 번호를 생성
        • 코드가 변경될 때마다 해시가 변경되므로 모든 버전에 대해 고유한 식별자를 보장
        • Git Commit hash
      ⇒ 코드의 ‘특정 상태’를 적당히 ‘표현’하는 것이 버저닝의 핵심 !

1.2 버전의 필요성

  • ‘사람들과 커뮤니케이션 하는 상황’이라면 버전을 사용해 커뮤니케이션을 수월하게 할 수 있음
    • 팀 내에서 협업을 하는 상황
    • 앱스토어에서 사용자에게 릴리즈 내용을 공지하는 상황
  • 계속해서 사용되고 지속적으로 개발 및 릴리즈가 이루어지는 소프트웨어 엔지니어링에는 버전이 반드시 필요함
    • 한 번의 릴리즈로 끝나는 소프트웨어에서는 버전이 필요하지 않음
      • 기억해야 할 특정 상태가 오직 ‘하나’이기 때문
      • ex. 외주 받은 프로젝트를 한 번 릴리즈하고 더 이상 수정하지 않는 경우
    • 한 번의 릴리즈로 끝나지 않고 지속적으로 개발 및 릴리즈가 이루어지는 소프트웨어에서는 버전이 필요함
      • 기억해야 할 특정 상태가 ‘여러개’이기 때문
      • ex. 커뮤니티에 의해 운영되는 오픈소스 (Python, Pytorch, Airflow 등)

2. 파이썬 버전 관리

2.1 파이썬의 버저닝

  • 파이썬은 SemVer을 사용한 버저닝이 이루어지고 있음
    • 이전 버전과 호환되지 않는 변경이 있는 경우 주 번호가 증가 → 파이썬 3.x 버전은 2.x 버전과 호환되지 않음
    • 이전 버전과 호환되며 새로운 기능이 추가되면 부 번호가 증가 → 파이썬 3.11.x 버전은 3.10.x, 3.9.x, … 버전에 호환
  • 프로젝트의 파이썬 버전을 표현하는 방법
    • 파이썬 3.8 이상에서 실행 가능: python >= 3.8, python 3.8+ python 3.8^
    • 파이썬 3.8로만 실행 가능: python == 3.8
    • 파이썬 3.10 이상, 3.11 미만 버전에서 실행 가능: python = “>=3.10, <3.11”
  •  

2.2 파이썬 설치

  • 파이썬 공식 홈페이지에서 파일을 다운받아 설치
  • conda로 설치
    • conda install python=3.11.0
  • Docker로 파이썬 이미지 설치
    • 파이썬 설치
      • docker pull python:3.11.0
    • 파이썬 사용 시에는 아래의 코드로 Docker 컨테이너 실행 & 접속
      • docker pull python:3.11.0
  • 패키지 관리자(brew, apt, winget)로 설치
    • # Mac OS (brew)
      brew install python@3.11
    • # Linux (Ubuntu)
      apt install python3.11
    • # Window (winget)
      winget install Python3.11
  • Pyenv로 설치
    • pyenv install 3.11.0

2.3 Pyenv

  • Pyenv 설치
    • Pyenv 설치
      • brew install pyenv
    • shell 설정 파일에 Pyenv 관련 환경 변수들 추가
      • echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
        echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
        echo 'eval "$(pyenv init -)"' >> ~/.zshr
      • 환경변수: 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임
    • 환경 변수 추가 후 shell 설정 업데이트
      • source ~/.zshrc
    • 설치 후 터미널에서 pyenv를 실행했을 때 다음과 같이 출력되면 성공

    • cf. 내가 사용하고 있는 shell 확인하는 방법
      • echo $SHELL
    • cf. shell 설정 파일 여는 방법
      • open ~/.zshrc
  • pyenv에서 파이썬 사용하기
    • 설치 가능한 파이썬 버전 확인
      • pyenv install --list
    • 특정 버전의 파이썬 설치
      • pyenv install 3.11.0
    • shell에서 파이썬 활성화
      • pyenv shell 3.11.0
    • 설치된 파이썬 버전 확인
      • pyenv versions
    • 기본 파이썬 버전 설정
      • pyenv global 3.11.0

3. 파이썬 프로젝트 버전 관리

3.1 가상 환경

  • 가상 환경 virtual environment
    • 독립된 공간을 만들어주는 기능
    • 가상 환경은 프로젝트 별로 각자의 격리된 환경을 갖도록 함
    • 가상 환경 별로 1) 파이썬 버전과 2) 설치한 패키지 목록을 다르게 설정할 수 있음
  • 가상 환경을 만드는 방법
    • venv
    • conda
    • pyenv-virtualenv
    • pipenv
    • 가상 환경 만들기
      • python -m venv [가상 환경 폴더를 만들 경로]
      • 보통 프로젝트 최상위 경로에서 .venv라는 이름의 폴더로 만드는 것이 convention
      • venv는 파이썬 내장 모듈이기 때문에 파이썬 설치 시 함께 설치되어 있음
    • 가상 환경 접속
      • source "[가상 환경 폴더/bin/activate]"
      • 접속하고 나면 shell 왼쪽에 (.venv)와 같은 가상 환경 접속 표시가 뜸
    • .venv 폴더 구조

3.2 패키지 매니저

  • 패키지 매니저
    • 패키지를 설치하고 버전을 관리하는 도구
  • 파이썬 패키지 매니저의 종류
    • pip
    • poetry
    • conda (anaconda의 패키지 매니저)
  • pip
    • 패키지 설치
      • pip install [패키지이름==버전]
    • 설치된 패키지 목록 출력
      • pip freeze
    • 설치된 패키지 목록 requirements.txt에 저장
      • pip freeze > requirements.txt
    • requirements.txt에 있는 패키지 목록 설치
      • pip install -r requirements.txt
    • pip는 버전이 업그레이드 될 수록 이전의 버그들이 픽스되거나 속도가 향상되는 등의 개선이 이루어지므로 항상 최신 버전으로 업그레이드 후 사용하는 것을 권장
      • pip install --upgrade pip
    • pip의 문제점
      • 개발 환경과 배포 환경에서의 패키지가 분리되지 않음
        • 배포 환경이 아닌 개발 환경에서만 사용하는 패키지들이 있을 때 이 두 환경에서의 패키지 목록을 분리해야 함
          • 여러 프로젝트에 대하여 각각 환경을 분리하는 것처럼, 개발 환경과 배포 환경 또한 분리할 필요성이 있음
          • ex. black은 개발 시에만 필요로 하는 패키지이므로, 배포 환경에는 포함될 필요가 없음
      • pip list로는 패키지 간 의존성을 파악할 수 없음
        • 하나의 패키지를 설치했을 때 해당 패키지에 의존하는 패키지들이 설치되지만, 그 패키지들 간의 의존성에 대한 정보를 찾을 수 없음
      • pip uninstall 시 삭제한 패키지와 의존성이 있던 패키지들은 삭제되지 않음
        • 이에 따라 사용하지 않는 패키지들이 그대로 남아있게 됨
      ⇒ pip로는 정교하게 패키지 관리를 할 수 없음
  • poetry

 

 

  •  shell 설정 파일에 환경 변수 추가
    • poetry 설치 시 출력되는 Add ‘export ~’ to your shell configuration file. 을 따라 shell 설정 파일 업데이트
  • 설치 확인

    • 프로젝트 경로에서 파이썬 프로젝트 초기화
      • poetry init
      • 프로젝트 경로에 pyproject.toml 파일이 생성됨
        • pyproject.toml: python 프로젝트에 대한 메타 정보를 담고 있는 파일
  • 패키지 설치
    • poetry add [패키지 이름]
      poetry add [패키지 이름] -D # 개발 환경에서만 사용할 패키지 설치
  • 설치된 패키지 확인
    • poetry show --tree
  • pip의 문제점을 해결한 poetry
    • 개발 환경과 배포 환경에서의 패키지가 분리되지 않음 → 분리 가능
    • 패키지 간 의존성을 파악할 수 없음 → 파악 가능
    • 삭제한 패키지와 의존성이 있던 패키지들은 삭제되지 않음 → 삭제됨
    •