venv로 프로젝트 환경관리

python 버전관리는 pyenv를 사용하고 있는데 프로젝트마다 환경격리를 위해 virtualenv를 사용하고 있었다. 근데 뭔가 pyenv 로 새로운 버전을 설치할 때마다 개별 환경도 그 버전을 따라가고 싶은 마음이 생겨 이번기회에 방법을 정리해보려고 한다.

virtualenv, venv, uv

뭘 해야할지 몰라서 예전부터 사용하던 virtualenv를 사용하고 있었는데 알아보니 굳이 설치할 필요없이 venv를 사용하면 되는거였다. virtualenv가 좀 더 세부적인 옵션이 있다고 하나 나는 매우 심플하게 사용하기 때문에 venv로 충분한거 같다. 그런데 또 요즘엔 uv가 대세라고 한다. uv는 rust로 만들어진 툴인데 어떤 버전의 python이 설치되어 있는지 상관없이 필요한 버전을 설치해서 사용한다고 한다. 가만 보니 pyenv + venv 조합을 한번에 제공하면서 좀 더 편의기능이 추가된 사실상 내가 원하는 기능의 종합세트다.

그럼 그걸 사용하면 되는거 아닌가 싶은데. 뭔가 아직은 uv가 익숙하지 않다. 일단은 사용하던 virtualenv를 venv로 전환하는 것만 하려고 한다.

venv 환경 업그레이드

python은 메이저버전은 말할 것도 없고 마이너버전도 호환이 안된다고 봐야한다. 그래서 마이너버전은 아예 다른 버전이라 생각하고 관리를 한다. 그래서 패치버전의 새로운 버전이 나오면 그걸로 모두 업그레이드를 하고 싶다. 근데 글로벌 버전으로 새로운 버전을 설치하고 기존 버전을 지워버리면 개별 프로젝트에서 사용하던 환경이 모두 깨져버린다. 그래서 또 각 환경마다 업그레이드를 해줘야한다. 사실상 업그레이드보다는 재설치라고 해야한다. 그 방법이 최선으로 보인다.

nodejs는 글로벌 버전이 변경되어도 module만 재설치해주면 되었는데 python은 참 쉽지가 않다. 그래서 계속 가상환경 관리 프로그램이 나오나부다. 어쨌든 내가 선택한 방법은 새로운 글로벌 버전을 설치했을때 개별 프로젝트의 환경을 지우고 재설치하는 것이다. 그럼 이걸 편하게 하기 위해서 스크립트가 필요하다.

# venv를 재설치
recreate-venv() {
    local target="${1:-venv}"
    local py_bin="$(which python)"

    echo "Python venv 재생성: '${target}' using ${py_bin} ($("${py_bin}" -V))..."
    rm -rf "${target}"
    "${py_bin}" -m venv "${target}"
    "${target}/bin/python" -m pip install --quiet --upgrade pip

    if [[ -f "requirements.txt" ]]; then
        "${target}/bin/pip" install -r requirements.txt
    fi
    source "${target}/bin/activate"
}

이걸 전에 만들었던 ~/.zsh/zshrc 안에 넣어두면 된다.

❯ recreate-venv
Python venv 재생성: 'venv' using /Users/joo.yoon/.pyenv/shims/python (Python 3.14.9)...
Collecting requests (from -r requirements.txt (line 1))
  Using cached requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Collecting urllib3 (from -r requirements.txt (line 2))
  Using cached urllib3-2.8.0-py3-none-any.whl.metadata (7.4 kB)
...

 

일단은 이렇게 사용해보고 나중에 uv를 좀 더 알아봐야겠다.

반응형