Python 강좌 / 가상환경 만들기와 pip로 패키지 관리하기
가상환경은 프로젝트별로 Python 패키지 설치 공간을 분리하는 기능입니다. pip는 해당 환경에 패키지를 설치하는 도구이므로 python -m pip 형태로 실행해 어느 Python에 설치하는지 명확히 합니다.
가상환경이 필요한 이유
서로 다른 프로젝트가 같은 패키지의 다른 버전을 요구할 수 있습니다. 전역 환경 하나에서 모든 버전을 바꾸면 다른 작업이 갑자기 실패할 수 있으므로 프로젝트마다 .venv를 만듭니다. 가상환경은 운영체제나 파일 권한까지 격리하는 보안 장치가 아니며, 실행한 코드는 현재 사용자 권한으로 파일에 접근할 수 있습니다.
관련 동작과 지원 조건은 Python: venv에서 확인할 수 있습니다.
| 항목 | 역할 |
|---|---|
| Python | 코드를 실행하는 인터프리터 |
| venv | 프로젝트용 설치 공간 생성 |
| pip | 외부 패키지 설치·조회·삭제 |
| requirements.txt | 재설치할 패키지와 버전을 기록하는 텍스트 파일 |
환경 선택과 실제 패키지 활용은 VS Code에서 Python 코드 작성하고 실행하기에서 사용하는 규칙과 연결됩니다.
환경 생성과 활성화
이미 .venv가 있다면 먼저 어떤 환경인지 확인하고 임의로 덮어쓰지 않습니다. 새 프로젝트에서 다음 순서로 진행합니다.
python -m venv .venv
Windows PowerShell의 활성화 명령입니다.
.\.venv\Scripts\Activate.ps1
macOS·Ubuntu에서는 다음 명령을 사용합니다.
source .venv/bin/activate
PowerShell 실행 정책이 활성화를 차단하면 조직 정책을 확인하거나 .venv\Scripts\python.exe를 직접 실행하세요. 시스템 전체 실행 정책을 완화할 필요는 없습니다.
설치·버전 기록·재설치
아래는 표 형식 데이터를 다루는 pandas를 예로 든 명령입니다. 실제 사용할 패키지만 설치하고, 설치 전에 이름과 공식 배포처를 확인합니다. 패키지 이름과 import 이름은 다를 수 있습니다.
python -m pip install pandas
python -m pip show pandas
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt
pip freeze는 현재 환경의 설치 결과를 기록합니다. 다른 운영체제에서 항상 똑같이 설치된다는 보장이나 파일 해시 검증을 대신하지는 않습니다. PowerShell 버전에 따라 리디렉션으로 만든 텍스트 인코딩이 달라질 수 있으므로 재설치가 실패하면 파일 인코딩도 확인합니다.
활성화는 현재 셸에서 python을 찾는 우선순위를 바꾸는 편의 기능입니다. 활성화 전에는 시스템 Python을 가리킬 수 있지만 활성화 후 sys.executable은 프로젝트의 .venv 아래를 가리켜야 합니다. python -m pip --version도 같은 환경의 pip인지 확인합니다. 활성화가 막히면 환경을 다시 만들기 전에 가상환경 Python의 전체 경로로 실행하여 환경 자체와 셸 설정 문제를 구분합니다.
python -c "import sys; print(sys.executable)"
python -m pip --version
환경과 의존성 문제 확인하기
python -c "import sys; print(sys.executable)"
python -m pip --version
python -m pip check
ModuleNotFoundError가 나오면 먼저 인터프리터를 확인하고 해당 환경에 설치합니다. 관리자 권한으로 전역에 다시 설치하는 방식은 환경 불일치를 해결하지 못합니다. 인증서 오류나 프록시 문제는 신뢰 경로와 네트워크 설정을 확인하고, TLS 검증을 끄는 옵션으로 우회하지 않습니다.
사용을 마칠 때는 deactivate를 실행합니다. 패키지를 제거하려면 python -m pip uninstall 패키지명을 사용합니다. 가상환경을 다시 만들기 전에 소스와 requirements 파일이 .venv 밖에 있는지 확인하세요.




