pyenv 파이썬 버전 관리 완벽 가이드

여러 파이썬 프로젝트를 진행하다 보면 버전 충돌 문제에 직면하게 됩니다. 레거시 프로젝트는 Python 2.7, 새 프로젝트는 3.12를 요구하는 상황에서 어떻게 해야 할까요? 이 글에서는 pyenv와 pyenv-virtualenv를 활용한 완벽한 파이썬 버전 관리 방법을 알려드립니다.

pyenv가 필요한 이유

파이썬 라이브러리와 프레임워크는 각각 다른 파이썬 버전을 요구합니다. Django 4.2는 Python 3.8 이상, TensorFlow 2.15는 3.9-3.11만 지원하는 식입니다. 시스템 파이썬만 사용하면 프로젝트마다 버전을 바꿀 수 없고, 패키지 충돌도 발생합니다. pyenv는 여러 파이썬 버전을 설치하고 프로젝트별로 다른 버전을 사용할 수 있게 해줍니다.

pyenv vs virtualenv 차이점

pyenv: 파이썬 버전 관리 (2.7, 3.8, 3.12 등을 동시에 설치)

virtualenv: 패키지 격리 (같은 파이썬 버전에서 프로젝트별 패키지 분리)

pyenv-virtualenv: pyenv + virtualenv 조합 (버전 + 패키지 모두 격리)

macOS 설치 방법

1단계: Homebrew로 pyenv 설치

# Homebrew 업데이트
brew update && brew upgrade

# pyenv 설치
brew install pyenv

# pyenv-virtualenv 설치
brew install pyenv-virtualenv

# 설치 확인
pyenv --version
# pyenv 2.3.36

2단계: 필수 의존성 설치

# Xcode Command Line Tools
sudo xcode-select --install

# 빌드 도구
brew install openssl readline sqlite3 xz zlib

# Python 컴파일에 필요한 라이브러리
brew install tcl-tk

중요: 이 패키지들이 없으면 파이썬 설치 중 오류가 발생합니다.

3단계: 환경변수 설정

Bash 사용자:

# ~/.bash_profile 또는 ~/.bashrc 파일 편집
nano ~/.bash_profile

# 아래 내용 추가
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# 적용
source ~/.bash_profile

Zsh 사용자 (macOS 기본):

# ~/.zshrc 파일 편집
nano ~/.zshrc

# 아래 내용 추가
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# 적용
source ~/.zshrc

설정 확인:

# 터미널을 재시작하거나 source 명령 후
which pyenv
# /Users/username/.pyenv/bin/pyenv

echo $PYENV_ROOT
# /Users/username/.pyenv

Linux (Ubuntu/CentOS) 설치

Ubuntu/Debian

# 필수 패키지 설치
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \\\\
  libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \\\\
  libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \\\\
  libffi-dev liblzma-dev

# pyenv 설치
curl <https://pyenv.run> | bash

# 환경변수 설정 (~/.bashrc에 추가)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

# 적용
source ~/.bashrc

CentOS/RHEL

# 필수 패키지
sudo yum groupinstall -y "Development Tools"
sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \\\\
  sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel

# pyenv 설치
curl <https://pyenv.run> | bash

# 환경변수 설정 (~/.bashrc에 추가)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

# 적용
source ~/.bashrc

파이썬 버전 설치

설치 가능한 버전 확인

# 모든 설치 가능한 버전 보기
pyenv install --list

# 최신 3.x 버전만 보기
pyenv install --list | grep "^\\\\s*3\\\\."

# 특정 버전 검색
pyenv install --list | grep 3.12

파이썬 설치

# Python 3.12 최신 버전 설치
pyenv install 3.12.0

# Python 3.11 설치
pyenv install 3.11.7

# Python 3.9 설치 (레거시 프로젝트용)
pyenv install 3.9.18

# Python 2.7 설치 (아주 오래된 프로젝트)
pyenv install 2.7.18

# 설치 진행 상황 확인
# 컴파일 중... (5-15분 소요)

설치 시간: 버전과 시스템 성능에 따라 5-15분 소요

설치된 버전 확인

# 설치된 모든 버전 보기
pyenv versions

# 출력 예시:
# * system (set by /Users/username/.pyenv/version)
#   3.9.18
#   3.11.7
#   3.12.0

# * 표시는 현재 활성화된 버전

파이썬 버전 전환

전역(Global) 버전 설정

# 시스템 전체에서 사용할 기본 버전
pyenv global 3.12.0

# 확인
python --version
# Python 3.12.0

pyenv versions
# * 3.12.0 (set by /Users/username/.pyenv/version)
#   3.11.7
#   3.9.18

적용 범위: 모든 디렉토리에서 기본적으로 사용

로컬(Local) 버전 설정

# 프로젝트 디렉토리로 이동
mkdir ~/project-legacy
cd ~/project-legacy

# 이 디렉토리에서만 Python 3.9 사용
pyenv local 3.9.18

# 확인
python --version
# Python 3.9.18

# .python-version 파일 생성됨
cat .python-version
# 3.9.18

# 다른 디렉토리로 이동하면 global 버전 사용
cd ~
python --version
# Python 3.12.0

적용 범위: 해당 디렉토리와 하위 디렉토리에서만 적용

쉘(Shell) 버전 설정

# 현재 쉘 세션에서만 임시로 변경
pyenv shell 3.11.7

# 확인
python --version
# Python 3.11.7

# 해제
pyenv shell --unset

# 또는 터미널 재시작하면 자동 해제

적용 범위: 현재 터미널 세션에서만 적용

가상환경 생성 및 관리

가상환경 생성

# 기본 형식: pyenv virtualenv <python-version> <env-name>

# Python 3.12로 django-project 가상환경 생성
pyenv virtualenv 3.12.0 django-project

# Python 3.9로 flask-app 가상환경 생성
pyenv virtualenv 3.9.18 flask-app

# 버전 생략 시 현재 global 버전 사용
pyenv virtualenv my-project

# 생성된 가상환경 확인
pyenv versions
# * 3.12.0 (set by ...)
#   3.11.7
#   3.9.18
#   3.12.0/envs/django-project
#   django-project
#   3.9.18/envs/flask-app
#   flask-app

가상환경 활성화

# 수동 활성화
pyenv activate django-project

# 프롬프트 변경됨
# (django-project) username@macbook:~$

# 확인
python --version
# Python 3.12.0

which python
# /Users/username/.pyenv/versions/django-project/bin/python

# 비활성화
pyenv deactivate

프로젝트에 가상환경 자동 적용

# 프로젝트 디렉토리 생성
mkdir ~/django-project
cd ~/django-project

# 가상환경을 local로 설정
pyenv local django-project

# 이제 이 디렉토리에 들어오면 자동 활성화됨
cd ~/django-project
# (django-project) username@macbook:~/django-project$

# 다른 곳으로 이동하면 자동 비활성화
cd ~
# username@macbook:~$

자동 활성화: pyenv virtualenv-init가 설정되어 있으면 자동으로 작동

가상환경 삭제

# 가상환경 삭제
pyenv uninstall django-project

# 확인 메시지
# pyenv: remove /Users/username/.pyenv/versions/3.12.0/envs/django-project? [y|N] y

# 파이썬 버전도 삭제 가능
pyenv uninstall 3.9.18

실전 프로젝트 설정 예제

예제 1: Django 프로젝트

# 1. 프로젝트 디렉토리 생성
mkdir ~/my-django-blog
cd ~/my-django-blog

# 2. Python 3.12 설치 (없다면)
pyenv install 3.12.0

# 3. 가상환경 생성
pyenv virtualenv 3.12.0 django-blog-env

# 4. 가상환경 적용
pyenv local django-blog-env

# 5. Django 설치
pip install --upgrade pip
pip install django

# 6. Django 프로젝트 시작
django-admin startproject mysite .

# 7. requirements.txt 생성
pip freeze > requirements.txt

# 8. Git 설정
echo ".python-version" >> .gitignore

# 9. 확인
python --version
# Python 3.12.0

pip list
# Django 5.0
# ...

예제 2: Flask API 프로젝트

# 1. 프로젝트 설정
mkdir ~/flask-api
cd ~/flask-api

# 2. Python 3.11로 가상환경
pyenv virtualenv 3.11.7 flask-api-env
pyenv local flask-api-env

# 3. Flask 설치
pip install flask flask-cors python-dotenv

# 4. 프로젝트 파일 생성
cat > app.py << 'EOF'
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return {'message': 'Hello from Flask!'}

if __name__ == '__main__':
    app.run(debug=True)
EOF

# 5. 실행
python app.py

# 6. requirements.txt
pip freeze > requirements.txt

예제 3: 데이터 분석 프로젝트

# 1. 프로젝트 설정
mkdir ~/data-analysis
cd ~/data-analysis

# 2. Python 3.10 (안정성)
pyenv install 3.10.13
pyenv virtualenv 3.10.13 data-env
pyenv local data-env

# 3. 데이터 분석 라이브러리 설치
pip install numpy pandas matplotlib seaborn jupyter scikit-learn

# 4. Jupyter 실행
jupyter notebook

# 5. requirements 저장
pip freeze > requirements.txt

예제 4: 레거시 프로젝트 (Python 2.7)

# 1. 옛날 프로젝트
mkdir ~/legacy-project
cd ~/legacy-project

# 2. Python 2.7 설치
pyenv install 2.7.18

# 3. 가상환경
pyenv virtualenv 2.7.18 legacy-env
pyenv local legacy-env

# 4. 의존성 설치
pip install -r requirements.txt

# 5. 실행
python old_script.py

패키지 관리

requirements.txt 활용

# 현재 환경의 패키지 저장
pip freeze > requirements.txt

# 내용 확인
cat requirements.txt
# Django==5.0.1
# requests==2.31.0
# pandas==2.1.4

# 다른 환경에서 설치
pip install -r requirements.txt

# 특정 패키지만 업데이트
pip install --upgrade django

# 업데이트 후 다시 저장
pip freeze > requirements.txt

개발 환경과 프로덕션 분리

# 개발 환경
pip freeze > requirements-dev.txt

# 프로덕션 환경 (테스트 패키지 제외)
pip freeze | grep -v "pytest\\\\|black\\\\|flake8" > requirements.txt

# 또는 수동으로 분리
cat > requirements.txt << 'EOF'
Django==5.0.1
psycopg2-binary==2.9.9
gunicorn==21.2.0
EOF

cat > requirements-dev.txt << 'EOF'
-r requirements.txt
pytest==7.4.3
black==23.12.1
flake8==7.0.0
EOF

# 설치
pip install -r requirements-dev.txt

자주 사용하는 명령어 정리

# 설치 관련
pyenv install --list                    # 설치 가능한 버전 목록
pyenv install 3.12.0                    # 파이썬 설치
pyenv uninstall 3.9.18                  # 파이썬 삭제

# 버전 확인 및 전환
pyenv versions                          # 설치된 버전 확인
pyenv version                           # 현재 활성 버전
pyenv global 3.12.0                     # 전역 버전 설정
pyenv local 3.11.7                      # 로컬 버전 설정
pyenv shell 3.9.18                      # 쉘 버전 설정

# 가상환경
pyenv virtualenv 3.12.0 myenv           # 가상환경 생성
pyenv activate myenv                    # 활성화
pyenv deactivate                        # 비활성화
pyenv virtualenvs                       # 가상환경 목록
pyenv uninstall myenv                   # 가상환경 삭제

# 기타
pyenv which python                      # python 실행파일 위치
pyenv which pip                         # pip 실행파일 위치
pyenv rehash                            # shim 재생성 (수동, 보통 자동)

문제 해결

문제 1: pyenv 명령어를 찾을 수 없음

# 환경변수 확인
echo $PATH | grep pyenv

# 없으면 ~/.bashrc 또는 ~/.zshrc에 추가
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

# 적용
source ~/.zshrc  # 또는 ~/.bashrc

문제 2: Python 설치 실패

# 로그 확인
cat /tmp/python-build.*.log

# macOS: Xcode Command Line Tools 재설치
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --install

# 빌드 도구 재설치
brew reinstall openssl readline sqlite3 xz zlib

# 환경변수 설정 후 재시도
export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib"
export CPPFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include"

pyenv install 3.12.0

문제 3: pip 명령어 오류

# pip 업그레이드
python -m pip install --upgrade pip

# pip 재설치
curl <https://bootstrap.pypa.io/get-pip.py> -o get-pip.py
python get-pip.py

# pyenv rehash
pyenv rehash

문제 4: 가상환경이 자동 활성화되지 않음

# virtualenv-init 확인
cat ~/.zshrc | grep virtualenv

# 없으면 추가
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
source ~/.zshrc

문제 5: Homebrew shallow clone 오류

# macOS Homebrew 오류 해결
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow

# 업데이트
brew update && brew upgrade

팀 협업 설정

.python-version 파일 공유

# 프로젝트 루트에 .python-version 생성
echo "3.12.0" > .python-version

# Git에 커밋
git add .python-version
git commit -m "Add Python version specification"

# 팀원이 clone 후
cd project
pyenv install  # .python-version 읽고 자동 설치

README.md에 설정 가이드 추가

# 프로젝트명

## 개발 환경 설정

### 1. pyenv 설치
\\\\```bash
# macOS
brew install pyenv pyenv-virtualenv

# Linux
curl <https://pyenv.run> | bash
\\\\```

### 2. 파이썬 및 가상환경 설정
\\\\```bash
# 파이썬 설치
pyenv install

# 가상환경 생성 및 활성화
pyenv virtualenv $(cat .python-version) myproject-env
pyenv local myproject-env

# 의존성 설치
pip install -r requirements.txt
\\\\```

### 3. 실행
\\\\```bash
python manage.py runserver
\\\\```

마치며

pyenv는 pyenv install로 여러 파이썬 버전을 설치하고, pyenv global/local로 버전을 전환하며, pyenv virtualenv로 가상환경을 생성하는 3단계로 완벽한 파이썬 버전 관리가 가능합니다.

프로젝트마다 .python-version 파일로 버전을 명시하고, requirements.txt로 의존성을 관리하면 팀 협업도 원활해집니다. 레거시 프로젝트부터 최신 프로젝트까지 버전 충돌 없이 동시에 개발할 수 있습니다.

이 가이드를 활용해 깔끔한 파이썬 개발 환경을 구축하세요!


참고 자료

댓글 남기기