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
- CalVer (Calender Versioning)
- 버저닝이란?
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
- # Mac OS (brew)
- 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 - 환경변수: 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임
- echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
- 환경 변수 추가 후 shell 설정 업데이트
- source ~/.zshrc
- 설치 후 터미널에서 pyenv를 실행했을 때 다음과 같이 출력되면 성공
- Pyenv 설치
-
- cf. 내가 사용하고 있는 shell 확인하는 방법
- echo $SHELL
- cf. shell 설정 파일 여는 방법
- open ~/.zshrc
- cf. 내가 사용하고 있는 shell 확인하는 방법
- 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 시 삭제한 패키지와 의존성이 있던 패키지들은 삭제되지 않음
- 이에 따라 사용하지 않는 패키지들이 그대로 남아있게 됨
- 개발 환경과 배포 환경에서의 패키지가 분리되지 않음
- 패키지 설치
- poetry
- shell 설정 파일에 환경 변수 추가
- poetry 설치 시 출력되는 Add ‘export ~’ to your shell configuration file. 을 따라 shell 설정 파일 업데이트
- 설치 확인
-
- 프로젝트 경로에서 파이썬 프로젝트 초기화
- poetry init
- 프로젝트 경로에 pyproject.toml 파일이 생성됨
- pyproject.toml: python 프로젝트에 대한 메타 정보를 담고 있는 파일
- 프로젝트 경로에서 파이썬 프로젝트 초기화
- 패키지 설치
- poetry add [패키지 이름]
poetry add [패키지 이름] -D # 개발 환경에서만 사용할 패키지 설치
- poetry add [패키지 이름]
- 설치된 패키지 확인
- poetry show --tree
- pip의 문제점을 해결한 poetry
- 개발 환경과 배포 환경에서의 패키지가 분리되지 않음 → 분리 가능
- 패키지 간 의존성을 파악할 수 없음 → 파악 가능
- 삭제한 패키지와 의존성이 있던 패키지들은 삭제되지 않음 → 삭제됨