다음 개념을 정확히 알면 pip 명령을 실행하고 결과를 바라는 수준에서 벗어나 환경을 스스로 설명하고 고칠 수 있어.
Virtual environment(venv). 자체 Python 인터프리터와 site-packages를 가진 디렉터리야. 활성화하면 셸의 PATH가 바뀌어 python과 pip이 venv 안의 실행 파일로 연결되고, 비활성화하면 원래 PATH로 돌아가. 프로젝트마다 환경을 따로 두므로 서로 의존성이 새지 않아. 언제든 다시 만들 수 있는 .venv 디렉터리는 gitignore에 넣어야 해.
requirements.txt. requests==2.31.0이나 flask>=3.0처럼 패키지와 선택적 버전 제약을 적는 평평한 텍스트 파일이야. pip은 pip install -r requirements.txt로 읽어. 중요한 점은 requirements.txt가 진짜 lockfile이 아니라는 것이야. 전이 의존성의 버전과 콘텐츠 해시를 모두 기록한다고 보장하지 않아. 제대로 재현하려면 작은 requirements.in에서 모든 버전을 고정한 파일을 만드는 pip-tools나 uv의 uv.lock을 써야 해.
Editable install(pip install -e .). Python 패키지를 개발할 때는 저장할 때마다 다시 설치하지 않고 소스 변경을 곧바로 반영해야 해. 이 명령은 패키지를 복사하는 대신 venv의 site-packages에서 원본 소스를 가리키게 해. Python 라이브러리 개발의 표준 방식이야.
한계. pip은 여러 Python 버전을 직접 관리하지 않으므로 pyenv 같은 도구가 필요하고, 의존성을 순차적으로 해석하고 내려받아 uv보다 설치가 느려. 패키지를 제거해도 더 이상 쓰이지 않는 의존성이 남아 시간이 갈수록 쌓이기도 해. pip의 설계 범위가 이 문제들을 다루지 않는 거야.